ajax post を介してシリアル化されたデータをアクションに投稿しようとしていますが、JSON を介してすべてのモデル エラーを返す必要があります。サンプル プロジェクトを開発しましたが、想定どおりにモデル エラーが json 形式で返されます。しかし、プロジェクトで同じことを適用しようとすると、json の結果を返す代わりに、要求したページが返されます。
$.ajax(
{
url: action,
type: "POST",
cache: false,
dataType: "json",
data: jsonSerializedData,
success: function (result) {
getValidationSummary($('#titleseparator')).html('');
callback(result);
},
error: function (error, errorCode) {
if (error.status == '530') {
alert(error);
}
else if (error.status = '400' && error.responseText != '') {
var jsonResponse = jQuery.parseJSON(error.responseText);
//error.responseText should return json result but it returns a page with full view(which is the current page where I have requested)
}
else {
alert(error);
}
}
});
アクション:
[HttpPost]
[HandleModelState]
public ActionResult CreateEmployee(Employee emp)
{
if (emp.Name.Length <= 5)
ModelState.AddModelError("Name", "Name should contain atleast 6 characters");
if (emp.Address.Length <= 10)
ModelState.AddModelError("Address", "Address should contain atleast 11 characters");
if (!ModelState.IsValid)
{
ModelState.AddModelError(string.Empty, "Please correct errors");
throw new ModelStateException(ModelState);
}
return json();
}
モデル状態アクション フィルター:
public sealed class HandleModelState : FilterAttribute, IExceptionFilter
{
/// <summary>
/// Called when an exception occurs and processes <see cref="ModelStateException"/> object.
/// </summary>
/// <param name="filterContext">Filter context.</param>
public void OnException(ExceptionContext filterContext)
{
if (filterContext == null)
throw new ArgumentNullException("filterContext");
if (filterContext.Exception != null
&& typeof(ModelStateException).IsInstanceOfType(filterContext.Exception)
&& !filterContext.ExceptionHandled)
{
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.ContentEncoding = Encoding.UTF8;
filterContext.HttpContext.Response.HeaderEncoding = Encoding.UTF8;
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
filterContext.HttpContext.Response.StatusCode = 400;
var errors = (filterContext.Exception as ModelStateException).Errors;
filterContext.Result = new JsonResult
{
Data = new
{
HasErrors = errors.Count > 0,
Errors = errors.Select(e => new { Name = e.Key, Error = e.Value });
}
};
}
}
}
上記のコードはサンプル プロジェクトでは正常に動作しますが、実際のプロジェクトでは動作しないことに注意してください。web.config を確認しましたが、すべて同じです。
以下は、error.responseText で見つけた内容です。
エラーが見つかりました アプリケーションでエラーが発生しました。要求したページが存在しない可能性があります。URL を入力した場合は、URL が正しいことを確認してください。いずれにせよ、それは取り返しのつかない、致命的な、そうでなければ取り返しのつかないエラーを被りました。
続けるにはこちらをクリック。
Demos.SupplierPortal.Web.UI.ModelStateException: 経験が必要です E:\Demos\SP\CodeBase\SupplierPortal\Demos.SupplierPortal の Demos.SupplierPortal.Web.UI.Controllers.SkillController.AddSkill(SkillsViewModel item) で経験年数を入力してください.Web.UI\Controllers\SkillController.cs: System.Web.Mvc の lambda_method(Closure 、 ControllerBase 、 Object[] ) の行 152。
2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary
System.Web.Mvc.ControllerActionInvoker.<>c_ DisplayClass15.b _12() の ReflectedActionDescriptor.Execute(ControllerContext controllerContext、IDictionary 2 パラメーター) System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter ( IActionFilter フィルター、ActionExecutingContext preContext、Func1 continuation) at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<>c__DisplayClass17.<InvokeActionMethodWithFilters>b__14() at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName).Message での 1 つのフィルター、ActionDescriptor actionDescriptor、IDictionary`2 パラメーター)