C# 请求模型与响应模型不同时的ASP.NET核心验证
假设我有这样一个视图模型:C# 请求模型与响应模型不同时的ASP.NET核心验证,c#,validation,asp.net-core,asp.net-core-mvc,C#,Validation,Asp.net Core,Asp.net Core Mvc,假设我有这样一个视图模型: public class MyViewModel { //...Other properties and methods... public MyEntity Entity { get; set;} } 我在my view.cshtml中使用MyViewModel @model MyViewModel 但是POST-controller方法绑定到MyEntity类,因为这就是操作所需的全部内容 [HttpPost] public IActionRe
public class MyViewModel
{
//...Other properties and methods...
public MyEntity Entity { get; set;}
}
我在my view.cshtml中使用MyViewModel
@model MyViewModel
但是POST-controller方法绑定到MyEntity类,因为这就是操作所需的全部内容
[HttpPost]
public IActionResult Add(MyEntity entityDetails)
{
if (ModelState.IsValid)
//if valid
return View(new MyViewModel { Entity = entityDetails });
}
问题是在验证MyEntity时,ModelState包含该类的本地属性名,而视图使用父级“MyViewModel”类。当我尝试检索实体的错误时,它找不到任何错误,因为ModelState字典将包含像“Name”而不是“entity.Name”这样的键
有办法解决这个问题吗?如果我可以指定“回发”模型和“视图”模型,那就太好了。或者,如果有一种方法可以修改ModelState,使键前缀为“Entity”。或者强制asp验证=“Name”代码忽略编译错误(发生这种情况是因为找不到属性)
还要注意的是,在添加控制器操作中使用MyViewModel并不理想。我不想谈细节,但在我看来这会让事情变得很尴尬。我可能会这么做,但是我想考虑其他的选择。 代码中有2个问题导致了问题。 1.发回控制器的模型名称 当您仅回发视图模型的一部分时,作为控制器参数的部分模型的名称不能是任意的。它必须与您在视图模型中声明的名称相匹配 在本例中,您在
MyViewModel
中调用了它Entity
,因此Add()
方法的参数必须命名为相同的名称:
[HttpPost]
//公共IActionResult添加(MyEntity entityDetails)
公共IActionResult添加(MyEntity实体)
{
...
}
2.实体名称输入的名称
我不明白为什么在验证中使用标记帮助器,而在输入中不使用标记帮助器。实体名称输入的名称属性应该是name=“Entity.name”
,而不是硬编码的name=“name”
你不想把它硬编码成那样。这就是标记帮助器的作用
<form asp-action="Add" method="post">
@*<input type="text" id="name" name="Name" class="form-control" />*@
<input asp-for="Entity.Name" class="form-control" />
<span asp-validation-for="Entity.Name" class="text-danger"></span>
...
@**@
...
如果可以解决这两个问题,您应该能够在
ModelState
中看到键Entity.Name
:
太好了,谢谢。这帮我解决了我的问题
<form asp-action="Add" method="post">
@*<input type="text" id="name" name="Name" class="form-control" />*@
<input asp-for="Entity.Name" class="form-control" />
<span asp-validation-for="Entity.Name" class="text-danger"></span>
...