2012-06-13 21 views
0

我的应用程序中有一个索引视图,显示供应商列表。我也想添加一个小表单来在该页面上添加新的项目。创建表单将发布到创建操作。我的模型类包含一个供应商列表,以及一个名为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> 

有没有简单的东西,我失踪,使这项工作?

这里的事情,我可以做的来解决这个列表:

  1. 有我创建行动把我的指数模型的实例,而不是一个SoftwareVendor的。不过,我仍然有一个传统的创建视图,我不想这样做。
  2. 没有我的创建操作采取任何参数。相反,手动查看表单键并从“名称”或“NewVendor.Name”中取出名称,无论哪一个。
  3. 创建操作需要两个模型类,并检测哪一个正确填充。这很像#2,但我检查属性的非空值而不是检查表单集合。
  4. 找出如何制作一个模型活页夹来执行#2正在做的事情。这看起来过于复杂,而且我会在很多页面上遇到这个问题,所以我希望能有一个更简单的方法。
  5. 使用JavaScript来发表帖子而不是表单提交,所以我可以控制发布的确切字段名称。这有效,但我更喜欢利用HTML表单,因为这是它的用途。
  6. 使用EditorFor的超载来指定字段名称,并手动创建验证消息。
  7. HtmlHelper上编写我自己的扩展方法,以获取可覆盖字段名称的新ValidationMessageFor

在这些选项中,#2或#5是我认为我会选择的那些,除非有更好的方法。

回答

0

好了,这工作:

@Html.EditorFor(model => model.NewVendor.Name, "string", "Name") 
@Html.ValidationMessage("Name") 

由于我只能用我上面的代码真正的问题是一个破碎的验证消息,这似乎解决我的问题。如果总体上有更好的解决方案,我仍然很好奇。

相关问题