سلام گویا جند هفتست درگیر این مساله شدید
یک مثال
ایتدا در کنترولر یک متد get جهت نمایش ویو و وهله سازی ویومدل میسازیم
[HttpGet]
public virtual ActionResult AddPersonnel()
{
var model = new PersonnelViewModel ();
return View( model);
}
و متد post برای دریافت از سمت کلاینت
[HttpPost]
[AjaxOnly] //فقط در حالت ايجكس قابل دسترسي باشد
[ValidateAntiForgeryToken]
public virtual ActionResult AddPersonnel(PersonnelViewModel model)
{
if (!ModelState.IsValid)
{
ModelState.AddModelError("", @"خطاهای برنامه را بررسی کنید");
return new JsonResult
{
Data = new
{
errors = ModelState.Keys.SelectMany(k => ModelState[k].Errors).Select(x => x.ErrorMessage).ToArray(),
IsSuccess = false
},
JsonRequestBehavior = JsonRequestBehavior.AllowGet,
}
};
}
var ctx= new AppDbCo0ntext();
ctx.Person.Add(new Person{Name=model.Name})
var i=ctx.saveChange();
return new JsonResult
{
Data = new
{
errors = ModelState.Keys.SelectMany(k => ModelState[k].Errors).Select(x => x.ErrorMessage).ToArray(),
IsSuccess = i>0
},
JsonRequestBehavior = JsonRequestBehavior.AllowGet,
}
};
}
یک اتربیوت بسازید برای حالت پست ajax
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public sealed class AjaxOnlyAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.HttpContext.Request.IsAjaxRequest() )
{
base.OnActionExecuting(filterContext);
}
else
{
throw new InvalidOperationException("This operation can only be accessed via Ajax requests");
}
}
}
سمت سرور تکمیل هست
حالا در سمت ویو
using ویومدل در سمت ویو فراموش نشود
@model PersonneViewModel
@using (Html.BeginForm("AddPersonnel", "ControllerName", FormMethod.Post, new { @class = "form-horizontal", role = "form", id = "inputForm" }))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(m => m.Name, new { @class = "control-label col-md-1 col-lg-1", @for = "Name" })
<div class="col-md-2 col-lg-2">
<div class="input-group">
@Html.TextBoxFor(x => x.Name, new { @class = "form-control", @for = "Name", id = "Name" })
</div>
</div>
<div class="col-md-2 col-lg-2">
<button type="button" id="save" class="btn btn-success">
<i class="fa fa-save"></i> ثبت نام
</button>
</div>
</div>
}
متد جی کوئری هم اینجور بنویسید
$("#save").click(function(e) {
e.preventDefault();
var button = $("#save");
var $form = $("#inputForm");
var validator = $form.data('validator');
validator.settings.ignore = ':hidden:not(".multiselect")';
validator.settings.ignore = ":hidden:not(select)";
var validateForm = function(form) {
//فعال سازي دستي اعتبار سنجي جيكوئري
var val = form.validate();
val.form();
return val.valid();
};
//اگر فرم اعتبار سنجي نشده، اطلاعات آن ارسال نشود
if (!validateForm($form)) return;
button.attr('disabled', 'disabled');
button.val("لطفا صبر کنید");
$.ajax({
url: '@Url.Action("AddPersonnel", "ControllerName نام کنترولر")',
type: "POST",
data: $form.serialize(), // فيلدهاي فرم در اینجا ارسال میشود
cache: false,
complete: function(xhr, status) {
var data = xhr.responseText;
if (xhr.status == 403) {
window.location = options.loginUrl;
} else if (status === 'error' || !data) {
$.each(data,
alert("برررسی خطا")
} else {
button.removeAttr('disabled');
button.val("ثبت در سیستم");
$('.validation-summary-errors').addClass('validation-summary-valid');
$('.validation-summary-errors').removeClass('validation-summary-errors');
}
},
success: function(data) {
if (data.IsSuccess) {
alert("ثبت شد");
} else {
if (data.errors != null) {
// show model state error
$.each(data.errors,
function(idx, errorMessage) {
alert(errorMessage);//بررسی خطا
}
);
}
}
},
error: function(xhr, ajaxOptions, thrownError) {
alert("خطا");
}
});
$('.validation-summary-errors').addClass('validation-summary-valid');
$('.validation-summary-errors').removeClass('validation-summary-errors');
button.removeAttr('disabled');
button.val("ثبت در سیستم");
});