MVC 3 - 列表的客户端验证

时间:2011-02-14 16:05:43

标签: jquery validation list asp.net-mvc-3

我有以下模型

public class ProductLang
{
  public int productID { get; set; }

  public int langID { get; set; }

  [Required, StringLength(150)]
  public string name { get; set; }

  [AllowHtml]
  public string description { get; set; }
}

控制器

public ActionResult Edit(int id)
{
  return View(_db.Products.FirstOrDefault(p => p.id.Equals(id)).ProductLangs);
}

查看

@model IEnumerable<ProductLang>

@using (Html.BeginForm()) {
  @Html.ValidationSummary(true)
  @Html.Hidden("id", Model.FirstOrDefault().productID)

  @foreach (var productLang in Model) {
    <div>
      @Html.Hidden("prodLang.Index", productLang.idLingua)
      @Html.Hidden("prodLang[" + productLang.langID + "].productID", productLang.productID)
      @Html.Hidden("prodLang[" + productLang.langID + "].langID", productLang.langID)

      <div class="editor-label">
        @Html.Label("prodLang" + productLang.langID + "__nome", "Name")
      </div>
      <div class="editor-field">
        @Html.TextBox("prodLang[" + productLang.langID + "].name", productLang.name)
        @Html.ValidationMessage("prodLang[" + productLang.langID + "].name")
      </div>
      <div class="editor-label">
        @Html.Label("prodLang" + productLang.langID + "__description", "Description")
      </div>
      <div class="editor-field">
        @Html.TextArea("prodLang[" + productLang.langID + "].description", productLang.description)
      </div>
    </div>
  } 

  <input type="submit" value="EDIT" />
}

我有其他视图和控制器,其中jquery unobstrusive验证工作,但不是在这里。我假设因为我有一个List。 事实上,如果我只用一个对象创建一个视图,那就可以了。

如何将jquery unobstrusive验证绑定到列表?

1 个答案:

答案 0 :(得分:4)

您可以考虑使用编辑器模板,而不是编写那些丑陋的foreach循环并尝试在视图中找到合适的输入名称,因为它会使您的视图更加简单:

@model IEnumerable<ProductLang>
@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    @Html.Hidden("id", Model.FirstOrDefault().productID)
    @Html.EditorForModel()
    <input type="submit" value="EDIT" />
}

然后在相应的编辑器模板(~/Views/Home/EditorTemplates/ProductLang.cshtml)内:

@model ProductLang
<div>
    @Html.HiddenFor(x => x.idLingua)
    @Html.HiddenFor(x => x.productID)
    @Html.HiddenFor(x => x.langID)

    <div class="editor-label">
        @Html.LabelFor(x => x.name, "Name")
    </div>
    <div class="editor-field">
        @Html.TextBoxFor(x => x.name)
        @Html.ValidationMessageFor(x => x.name)
    </div>
    <div class="editor-label">
        @Html.LabelFor(x => x.description, "Description")
    </div>
    <div class="editor-field">
        @Html.TextAreaFor(x => x.description)
    </div>
</div>

现在你会发现一切都自动神奇地出现了:正确的命名约定,这样当你回发时,默认的模型绑定器将能够重建视图模型,客户端和服务器端验证工作,清理视图,快乐用户: - )