我的应用程序中有一个显示供应商列表的索引视图。我还想添加一个小表单以在该页面上添加新项目。创建表单将发布到创建操作。我的模型类包含一个供应商列表,以及一个名为 NewVendor 的单一供应商的属性。
public IEnumerable<SoftwareVendor> Vendors { get; set; }
public SoftwareVendor NewVendor { get; set; }
该类SoftwareVendor
具有验证属性。这是一个实体框架类。
制作一个发布到 Create 操作的表单很容易:
@using (Html.BeginForm( "Create", "Vendor" )) {
@Html.ValidationSummary(true)
<fieldset>
<legend>New Software Vendor</legend>
<div class="editor-label">
@Html.LabelFor(model => model.NewVendor.Name)
</div>
<div class="editor-field">
@Html.EditorFor( model => model.NewVendor.Name )
@Html.ValidationMessageFor( model => model.NewVendor.Name )
</div>
<br />
<input type="submit" value="Create" />
</fieldset>
}
这个帖子很好,客户端验证也有效。但是,默认的 Create 操作需要一个实例,SoftwareVendor
并在表单集合中寻找一个名为“Name”的键。相反,上面的表格发布了“NewVendor.Name”。
我可以通过在@Html.EditorFor
.
@Html.EditorFor( model => model.NewVendor.Name, "string", "Name" )
现在创建操作很高兴,因为正在接收“名称”值。但是,验证消息被破坏了,因为它仍在寻找一个名为“NewVendor.Name”的字段,并且似乎没有办法覆盖它。
<span class="field-validation-valid" data-valmsg-for="NewVendor.Name" data-valmsg-replace="true"></span>
我缺少一些简单的东西来完成这项工作吗?
以下是我可以解决的问题列表:
- 让我的 Create 操作采用我的 Index 模型的实例而不是 SoftwareVendor。不过,我仍然有一个传统的创建视图,我不想这样做。
- 不要让我的创建操作带任何参数。相反,手动查看表单键并从“Name”或“NewVendor.Name”中提取名称,以两者为准。
- 让 Create 操作获取两个模型类并检测正确填充的模型类。这很像#2,但我正在检查非空值的属性,而不是检查表单集合。
- 弄清楚如何制作一个模型绑定器来执行 #2 正在做的事情。这似乎过于复杂,而且我将在许多页面中遇到这个问题,所以我希望有一个更简单的方法。
- 使用 javascript 来发布帖子而不是提交表单,这样我就可以控制我发布的确切字段名称。这行得通,但我更喜欢利用 HTML 表单,因为这就是它的用途。
- 使用重载
EditorFor
来指定字段名称,并手动创建验证消息。 - 为可以覆盖字段名称
HtmlHelper
的新方法编写我自己的扩展方法。ValidationMessageFor
在这些选项中,#2 或 #5 是我认为我会选择的选项,除非有更好的方法。