我是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方法中不起作用?
答案 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;
})