我的大多数操作方法在成功时返回 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/