C# 视图上未显示特定字段的模型状态错误验证
我有一个视图,其中有一些字段,并且我在控制器中添加了模型状态验证,该验证根据从下拉列表中选择的值检查两个特定字段是否为空 下面是我进行验证的代码:C# 视图上未显示特定字段的模型状态错误验证,c#,.net,asp.net-mvc,modelstate,C#,.net,Asp.net Mvc,Modelstate,我有一个视图,其中有一些字段,并且我在控制器中添加了模型状态验证,该验证根据从下拉列表中选择的值检查两个特定字段是否为空 下面是我进行验证的代码: public ActionResult Create(Fund fund) { if (fund.FundTypeId == 4) { if (string.IsNullOrEmpty(fund.AccountType)) { ModelState.AddModelError("
public ActionResult Create(Fund fund)
{
if (fund.FundTypeId == 4)
{
if (string.IsNullOrEmpty(fund.AccountType))
{
ModelState.AddModelError("AccountType", "Account Type required");
}
if (string.IsNullOrEmpty(fund.FilePath))
{
ModelState.AddModelError("FilePath", "File Path required");
}
}
}
在这里,我的代码检查模型状态,看它是否有效。它正确地显示模型状态为false,并且不执行插入和重定向。但是,我无法返回到当前视图,将基金模型作为参数,以便在导致错误的字段旁边正确显示错误
if (ModelState.IsValid)
{
// Perform the insert and redirect to Index page
}
// Need to have this view reflect the errors...
return View(fund);
我得到这个错误:
传递到字典中的模型项的类型为“Fund”,但此字典需要类型为“System.Web.Mvc.HandleErrorInfo”的模型项
更新:
基于我问题的“重复”,我必须将错误的模型从我的控制器传递到我的视图,并且我的视图必须定义一个“System.Web.Mvc.HandleErrorInfo”的模型,但事实并非如此
我没有将模型从视图传递到局部视图,也没有在布局文件中声明模型,以便排除这种情况
我还可以确认我的视图和控制器使用相同的模型类型
@using FundOfFunds_MVC.Models
@model Bank.Sec.Framework.Fund
@{
ViewBag.Title = "Create New FoF Fund";
var fundTypeModel = ViewData["FundType"] as FundTypeModel;
}
更新:
发生的情况是,在模型状态获得添加到其中的错误后,它会触发基金控制器中的OneException方法,然后调用它继承自的基本控制器中的OneException方法:
public class BaseController : Controller
{
private static readonly ILog databaseLogger = LogManager.GetLogger("DatabaseLogger");
protected override void OnException(ExceptionContext filterContext)
{
GlobalContext.Properties["PageName"] = filterContext.RouteData.Values["controller"];
GlobalContext.Properties["FunctionName"] = filterContext.RouteData.Values["action"];
databaseLogger.Error("MVC Controller Error", filterContext.Exception);
base.OnException(filterContext);
filterContext.ExceptionHandled = true;
this.View("Error").ExecuteResult(this.ControllerContext);
}
}
使用“错误”视图的最后一行是罪魁祸首。这是由不太精通MVC的人设计的代码,因此我正在尽最大努力纠正这一点,而不是重新发明轮子。您的视图似乎是强类型的,您正在使用
@model Fund
作为此视图的模型。继续按原样返回
基金
模型,但如果要在视图中显示错误,必须在视图中添加此行:
@Html.ValidationMessage("keyName")
在您的AccountType或FilePath中,只需将
keyName
替换为您的密钥名即可。我尝试过,但仍然无效。对于视图中的每个关键点,我基本上都是这样做的,对吗?如果是这样的话,“@Html.EditorFor(model=>model.FilePath)@Html.ValidationMessageFor(model=>model.FilePath)@Html.ValidationMessage(“FilePath”)”就不起作用了,不管您怎么想,您确实有一个视图包含@model HandleErrorInfo
。该类通常在使用控制器上的[HandleError(..)]
属性处理异常时使用,因此首先检查所有视图(最有可能在/views/Shared
文件夹中)是否具有正确的模型。我在共享文件夹中有一个带有HandleErrorInfo模型的“错误”视图。下一步是什么?我必须做某种覆盖吗?您没有显示相关代码,但是在某个地方出现了错误。正在调用cshtml
视图,您向其传递了一个名为基金
的模型。因此,我建议您首先在控制器和视图中放置断点,然后逐步查找错误发生的位置。发生的情况是,在模型状态添加错误后,它会在基金控制器中触发一个OneException方法,然后在它继承的基控制器中调用OneException方法。我将在我的主要问题中添加详细信息。将错误添加到ModelState
不会触发异常(代码中的其他部分正在这样做),但您的问题是使用this.View(“Error”).ExecuteResult(this.ControllerContext)
如果要重定向到OneException
中的错误页面,则可以使用filterContext.Result=RedirectToAction(…)
或filterContext.Result=newviewresult{ViewName=“~/Views/yourrorview.cshtml”}代码>