【问题标题】:ASP.NET Core validation when request model is different to response model请求模型与响应模型不同时的 ASP.NET Core 验证
【发布时间】:2020-07-07 13:15:02
【问题描述】:

假设我有一个这样的视图模型:

public class MyViewModel
{
    //...Other properties and methods...
    public MyEntity Entity { get; set;}
}

我在 view.cshtml 中使用 MyViewModel

@model MyViewModel

但是 POST 控制器方法绑定到 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”这样的键。

<form asp-action="Add" method="post">
    <input type="text" id="name" name="Name" class="form-control" />
    <span asp-validation-for="Entity.Name" class="text-danger"></span>

有没有办法解决这个问题?如果我可以指定“回发”模型以及“视图”模型,那就太好了。或者,如果有一种方法可以修改 ModelState 以在键前面加上“Entity.”。或者强制 asp-validation-for="Name" 代码忽略编译错误(这是因为它找不到属性)。

还要注意,在添加控制器操作中使用 MyViewModel 并不理想。我不会详细介绍,但在我看来这会让事情变得很尴尬。我可能会这样做,但我想考虑其他选择。

【问题讨论】:

    标签: c# validation asp.net-core asp.net-core-mvc


    【解决方案1】:

    您的代码中有 2 个问题导致了该问题。

    1。模型名称回传给控制器

    当您只回发部分视图模型时,部分模型的名称作为控制器的参数不能是任意的。它必须与您在视图模型中声明的名称相匹配。

    在您的情况下,您在MyViewModel 中将其称为Entity,因此Add() 方法的参数必须命名相同:

    [HttpPost]
    // public IActionResult Add(MyEntity entityDetails)
    public IActionResult Add(MyEntity entity)
    {
        ...
    }
    

    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

    【讨论】:

    • 太好了,谢谢。这帮助我解决了我的问题
    猜你喜欢
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    相关资源
    最近更新 更多