我的应用程序中有一个索引视图,显示供应商列表。我也想添加一个小表单来在该页面上添加新的项目。创建表单将发布到创建操作。我的模型类包含一个供应商列表,以及一个名为NewVendor的供应商的一个属性。将表单添加到发布到创建操作的索引页面的正确方法是什么?
public IEnumerable<SoftwareVendor> Vendors { get; set; }
public SoftwareVendor NewVendor { get; set; }
SoftwareVendor
类具有验证属性。它是一个实体框架类。
制作的形式,职位,以创建操作很简单:
@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>
}
这个帖子就好了,和客户端验证也适用。但是,默认的“创建”操作需要SoftwareVendor
的实例,并且正在名为“名称”的表单集合中寻找一个键。相反,上述表单发布“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>
有没有简单的东西,我失踪,使这项工作?
这里的事情,我可以做的来解决这个列表:
- 有我创建行动把我的指数模型的实例,而不是一个SoftwareVendor的。不过,我仍然有一个传统的创建视图,我不想这样做。
- 没有我的创建操作采取任何参数。相反,手动查看表单键并从“名称”或“NewVendor.Name”中取出名称,无论哪一个。
- 创建操作需要两个模型类,并检测哪一个正确填充。这很像#2,但我检查属性的非空值而不是检查表单集合。
- 找出如何制作一个模型活页夹来执行#2正在做的事情。这看起来过于复杂,而且我会在很多页面上遇到这个问题,所以我希望能有一个更简单的方法。
- 使用JavaScript来发表帖子而不是表单提交,所以我可以控制发布的确切字段名称。这有效,但我更喜欢利用HTML表单,因为这是它的用途。
- 使用
EditorFor
的超载来指定字段名称,并手动创建验证消息。 - 在
HtmlHelper
上编写我自己的扩展方法,以获取可覆盖字段名称的新ValidationMessageFor
。
在这些选项中,#2或#5是我认为我会选择的那些,除非有更好的方法。