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”}