鉴于网络应用程序应始终在POST(或更改服务器端状态的任何不可重复的请求)后重定向。
...人们如何使用MVC3模型验证并执行强制重定向?
最佳答案
通常,您仅在成功发布后才进行重定向(无模型验证错误),否则,您将发送带有验证错误消息的页面。
PRG模式中的重定向可防止重复发布,因此发送回同一页面(+错误消息)没有任何危害,因为发布不成功,除非进行某些更改才能通过验证,否则发布不会成功。
编辑:
您似乎正在寻找将ModelState
传递到下一个(重定向)请求的方法。这可以通过使用TempData
来存储ModelState
直到下一个请求来完成。仅供引用,TempData
使用 session 。
这可以通过ActionFilters
来实现。可以在MvcContrib项目代码中找到示例: ModelStateToTempDataAttribute
在weblogs.asp.net上的“最佳实践”文章中,还提到了其他技巧(似乎作者已移开博客,但我在新博客上找不到该文章)。从文章:
Controller
[AcceptVerbs(HttpVerbs.Get), OutputCache(CacheProfile = "Dashboard"), StoryListFilter, ImportModelStateFromTempData]
public ActionResult Dashboard(string userName, StoryListTab tab, OrderBy orderBy, int? page)
{
//Other Codes
return View();
}
[AcceptVerbs(HttpVerbs.Post), ExportModelStateToTempData]
public ActionResult Submit(string userName, string url)
{
if (ValidateSubmit(url))
{
try
{
_storyService.Submit(userName, url);
}
catch (Exception e)
{
ModelState.AddModelError(ModelStateException, e);
}
}
return Redirect(Url.Dashboard());
}
Action 筛选器
public abstract class ModelStateTempDataTransfer : ActionFilterAttribute
{
protected static readonly string Key = typeof(ModelStateTempDataTransfer).FullName;
}
public class ExportModelStateToTempData : ModelStateTempDataTransfer
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
//Only export when ModelState is not valid
if (!filterContext.Controller.ViewData.ModelState.IsValid)
{
//Export if we are redirecting
if ((filterContext.Result is RedirectResult) || (filterContext.Result is RedirectToRouteResult))
{
filterContext.Controller.TempData[Key] = filterContext.Controller.ViewData.ModelState;
}
}
base.OnActionExecuted(filterContext);
}
}
public class ImportModelStateFromTempData : ModelStateTempDataTransfer
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
ModelStateDictionary modelState = filterContext.Controller.TempData[Key] as ModelStateDictionary;
if (modelState != null)
{
//Only Import if we are viewing
if (filterContext.Result is ViewResult)
{
filterContext.Controller.ViewData.ModelState.Merge(modelState);
}
else
{
//Otherwise remove it.
filterContext.Controller.TempData.Remove(Key);
}
}
base.OnActionExecuted(filterContext);
}
}
关于asp.net-mvc-3 - 发布/状态更改后,MVC3模型验证最佳做法重定向,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7940939/