鉴于网络应用程序应始终在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/

10-16 20:13