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 };
}
}