ModelState 错误不会以部分视图形式显示

Posted

技术标签:

【中文标题】ModelState 错误不会以部分视图形式显示【英文标题】:ModelState errors don't show in partial view form 【发布时间】:2020-01-14 09:29:12 【问题描述】:

我在局部视图中有一部分表单。该表单部分可在不同页面中重复使用:

第 1 页(带有 CompanyId):

<form method="post">
    <partial name="_partialForm" model="Model.MyModel" />
    <input asp-for="CompanyId />
    <input type="submit" />
</form>

第 2 页(不含 CompanyId):

<form method="post">
    <partial name="_partialForm" model="Model.MyModel" />
    <input type="submit" />
</form>

_partialForm:

@model Models.MyModel

<label asp-for="FirstName"></label>
<input asp-for="FirstName />
<span asp-validation-for="FirstName"></span>
<label asp-for="LastName"></label>
<input asp-for="LastName />
<span asp-validation-for="LastName"></span>

我的模特:

[Required]
[DisplayName("First name")]
public string FirstName  get; set; 
[Required]
[DisplayName("Last name")]
public string LastName  get; set; 
public Guid? CompanyId  get; set; 

当我查看渲染页面的源时,label asp-for-values 在那里,input-fields 用data-val="true" data-val-required="Required" 装饰,所以绑定是好的。

当我发布表单时,我会检查if (!ModelState.IsValid),如果不是return Page()

结果是,如果 FirstName 或 LastName 为空,则 ModelState 无效,但不显示验证消息。

如果我将表单标签移动到部分视图(这意味着我不能保留 CompanyId 字段,因为它只能在单个页面上使用),则会显示验证错误。

有没有办法解决这个问题?

【问题讨论】:

表单属性中指定的动作名称在哪里?
应该是这样的:
检查呈现的 html 中呈现的控件名称属性值,是实际名称还是附加部分视图名称的实际名称。 Model Binder 用模型属性准确检查控件的 name 属性值,两者应该匹配。 @NomiAli 没有,意味着它被提交到同一个页面(它是 Razor 页面:OnGet() / OnPost()) &lt;partial name="_partialForm" model="Model.MyModel" /&gt; 更改为&lt;partial name="_partialForm" model="@Model.MyModel" /&gt; 【参考方案1】:

解决方案是 ViewData.TemplateInfo.HtmlFieldPrefix = "MyModel";在部分。

【讨论】:

以上是关于ModelState 错误不会以部分视图形式显示的主要内容,如果未能解决你的问题,请参考以下文章

Modelstate.addmodelerror 未显示在 PartialView 中

遍历ModelState中存储的错误信息

以 json 形式返回部分视图?

modelstate.isvalid false 因为该项目始终为空

Cocoa NSAlert不会以表格形式显示警报

来自 ActionFilter 的 ModelState - ASP .NET Core 2.1 API