为什么[必需]归因不会导致modelState错误

时间:2019-08-23 07:54:12

标签: c# asp.net-core-mvc model-binding

我是ASP.NET Core MVC的新手,只是有关模型验证的问题。下面是我的代码:

public class HomeController : Controller
{
   public ViewResult Index([Required]string nonExistName)
        {            
           // put a debugger here
           return View();
        }
}

因此,当我运行该应用程序时,使用的是默认路由,显然在查询字符串或路由值中不会存在称为nonExistName的任何内容,因此模型绑定应在ModelState中引发错误

但是实际上根本没有验证错误,我设置了一个断点来检查ModelState的状态,完全没有错误。我也尝试过ModelState.IsValid

public class HomeController : Controller
{
   public IActionResult Index([Required]string nonExistName)
   {            
      if (ModelState.IsValid)
      {
         return View();
      }
      return NotFound();
   }
}

仍返回正常的索引视图。

为什么[Required]不会在ModelState中引起错误?如果我将[Required] i放在模型类的属性上方,则它将起作用。但是为什么将其放在action方法中不起作用?

1 个答案:

答案 0 :(得分:2)

您描述的功能称为顶级节点验证。您可以在文档中详细了解:https://docs.microsoft.com/en-us/aspnet/core/mvc/models/validation?view=aspnetcore-2.1#top-level-node-validation

一个重要的注意事项是,它的运行方式会有所不同,具体取决于您所运行的ASP.NET Core版本。确保已启用功能,如文档所述:

  

使用CompatibilityVersion.Version_2_1或更高版本运行时,位于顶层   默认情况下启用节点验证。否则,顶级节点   验证被禁用。默认选项可以被覆盖   在以下位置设置AllowValidatingTopLevelNodes属性   (Startup.ConfigureServices),如下所示:

services.AddMvc(options => 
    {
        options.AllowValidatingTopLevelNodes = true;
    })