0

Ben Foster Automatic Validate Model Stateを使用して、次のコードがあります。

[ImportModelStateFromTempData]
public ActionResult Edit(int id, int otherProperty) {
    // ...
    return View()
}

[HttpPost,ValidateModelState]
public ActionResult Edit(int id, PaymentOrderCreateUpdateCommand order) {
    // ...
    return RedirectToAction("Index", new {otherProperty = order.otherProperty}
}

URLにいる:

/Edit/5?otherProperty=4

Edit [HttpPost] アクションに投稿する何らかのフォームに無効なモデル状態を入力すると、ValidateModelState はそれを実行し、リクエストを

/Edit/5 

問題は、そのビューを生成するために必要な ?otherProperty=4 がリダイレクトで失われることです。

自動モデル状態検証属性を変更して、クエリパラメーターを含める方法を知っている人はいますか?

質問を完了するために、ValidateModelStateAttribute クラスを追加します。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class ValidateModelStateAttribute : ModelStateTempDataTransfer {
    public override void OnActionExecuting(ActionExecutingContext filterContext) {
        if (!filterContext.Controller.ViewData.ModelState.IsValid) {
            if (filterContext.HttpContext.Request.IsAjaxRequest()) {
                ProcessAjax(filterContext);
            } else {
                ProcessNormal(filterContext);
            }
        }

        base.OnActionExecuting(filterContext);
    }

    protected virtual void ProcessNormal(ActionExecutingContext filterContext) {
        // Export ModelState to TempData so it's available on next request
        ExportModelStateToTempData(filterContext);

        // redirect back to GET action
        filterContext.Result = new RedirectToRouteResult(filterContext.RouteData.Values);
    }

    protected virtual void ProcessAjax(ActionExecutingContext filterContext) {

        var errors = filterContext.Controller.ViewData.ModelState.ToSerializableDictionary();
        var json = new JavaScriptSerializer().Serialize(errors);
        // send 400 status code (Bad Request)
        filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
        filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest;
        filterContext.HttpContext.Response.StatusDescription = "Invalid Model State";
        filterContext.Result = new ContentResult() { Content = json };
    }
}
4

2 に答える 2