Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 请求模型与响应模型不同时的ASP.NET核心验证_C#_Validation_Asp.net Core_Asp.net Core Mvc - Fatal编程技术网

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>
...