asp.net-mvc - 将 ModelState 错误复制到 TempData 并在 View 中显示它们

标签 asp.net-mvc asp.net-mvc-3 modelstate tempdata

我的大多数操作方法在成功时返回 PartialViews,在失败时返回 RedirectToAction 结果。为此,我想将模型状态错误复制到 TempData 中,以便可以将它们显示给用户。我在这里阅读了几个关于 SO 的问题和一些外部链接,但没有一个对我有用...我正在使用 MvcContrib 中的 ModelStateToTempData 属性装饰 ActionMethod,然后在 View 中显示如下:(这只是一个原型(prototype))

        @if (TempData.Count > 0)
        {
            foreach (var obj in TempData)
            {
                var errors = ((ModelStateDictionary)obj.Value).Values;
                foreach (var error in errors)
                {
                <div style="position:absolute; background:Black; color:White; top:250px; left:550px;">
                    <span style="margin-bottom:5px; display:block; height:25px;">@error.Value</span>
                </div>
                }
            }
        }

我不断收到System.Web.Mvc.ValueProviderResult,而不是显示错误本身。我知道这都是错误的,最终我想将模型状态错误过滤到 TempData 内的字典中,但现在我只想将错误字符串显示在 View 中。

P.S:我尝试在没有 MvcContrib 属性的情况下手动执行此操作,并且得到了相同的结果。但我确实更喜欢使用自己的代码,这样我可以更好地控制整个问题。

有什么建议吗?

最佳答案

好吧,在尝试了一百万件事之后,我自己找到了答案......:)

if (TempData["ModelErrors"] == null)
    TempData.Add("ModelErrors", new List<string>());
foreach (var obj in ModelState.Values)
{
    foreach (var error in obj.Errors)
    {
        if(!string.IsNullOrEmpty(error.ErrorMessage))
            ((List<string>)TempData["ModelErrors"]).Add(error.ErrorMessage);
    }
}
return RedirectToAction("Index", "Home");

在 View 中:

    <div id="validationMessages">
        @{
            var errors = (List<string>)TempData["ModelErrors"];
        }
        @if (errors != null && errors.Count() > 0)
        {
            <div style="position:absolute; background:Black; color:White; top:250px; left:550px;">
                @foreach (var error in errors)
                { 
                   <span style="margin-bottom:5px; display:block; height:25px;">@error</span> 
                }
            </div>
        }
    </div>

更新:

这里它位于 ActionFilter 内:

public class CopyModelStateErrorsToTempData : ActionFilterAttribute
{
    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))
            {
                if (filterContext.Controller.TempData["ModelErrors"] == null)
                    filterContext.Controller.TempData.Add("ModelErrors", new List<string>());
                foreach (var obj in filterContext.Controller.ViewData.ModelState.Values)
                {
                    foreach (var error in obj.Errors)
                    {
                        if (!string.IsNullOrEmpty(error.ErrorMessage))
                            ((List<string>)filterContext.Controller.TempData["ModelErrors"]).Add(error.ErrorMessage);
                    }
                }
            }
        }

        base.OnActionExecuted(filterContext);
    }
}

关于asp.net-mvc - 将 ModelState 错误复制到 TempData 并在 View 中显示它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5919944/

相关文章:

asp.net-mvc - 如何将 ASP.Net MVC 路由段中的 1 或 0 映射到 bool 操作方法输入参数

c# - 测试 ModelState 在 asp.net mvc 中始终有效

asp.net-mvc - 谁负责加载数据?

c# - MVC 中的 OnInit 和 Session

c# - 如何反序列化复选框值的 JSON 数据?

asp.net - 使用默认成员关系的 MVC3 Entity Framework

asp.net - asp net mvc 中 form action 属性的风险是什么?

vb.net - ASP.NET MVC3 - VB 中的 If 语句

asp.net MVC ModelState.IsValid 返回 false

list - MVC ModelState 删除列表模型中的项目时删除键