0

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, IDictionarySystem.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, IListSystem.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName).Message での 1 つのフィルター、ActionDescriptor actionDescriptor、IDictionary`2 パラメーター)

4

1 に答える 1

0

答えがわかりました。私のコントローラーは、例外を処理していたベースコントローラーから継承されています (保護されたオーバーライド void OnException(ExceptionContext filterContext))。そのため、ここでカスタム例外を確認し、処理しないように指示しました。

于 2012-08-30T06:27:32.693 に答える