如何为集合中的每个项添加@ Html.ValidationMessageFor?

时间:2014-07-27 17:27:47

标签: c# javascript asp.net asp.net-mvc-4 unobtrusive-validation

如何为@Html.ValidationMessageFor()中的每个item添加collection?说,

public class FooVm
{
  // some property
  public ICollection<BarVm> Bars { get; set; }
}

public class BarVm
{
  // some property
  [Range(1, int.Max, ErrorMessage = "Must be greater than 1")
  public float? Fox { get; set; }
}

然后在view

@model namespace.here.FooVm

<div class="container"></div>
<a href="#" class="trigger">Populate</a>

<script>
$(function() {
  var i = 0;
  var populate = function() {
    var strBuilder = '<input type="text" name="Bars[i].Fox" />';
    $(".container").append(strBuilder);
    return false;
  };

  $(".trigger").click(populate);
});
</script>

一切正常。但是如何在每个textbox中添加验证?我正在使用ASP.NET MVC 4仍在练习。我也在使用unobtrusive validation进行客户端验证。任何你应该做的事情 - 这个建议或提示,示例代码将是伟大的。感谢。

1 个答案:

答案 0 :(得分:2)

实际上,使用Javascript填充View并不是应该使用MVC的方式。相反,您可以渲染所有文本框:

首先是该类的代码:

public class FooVm
{
    // some property
    public List<BarVm> Bars { get; set; }

    public FooVm()
    {
        // Make sure the collection exists to prevent NullReferenceException
        this.Bars = new List<BarVm>();
    }
}

public class BarVm
{
    // some property
    [Range( 1, Int32.MaxValue, ErrorMessage = "Must be greater than 1" )]
    public float? Fox { get; set; }
}

现在是View的代码:

@model WebApplication2.Models.FooVm

<h2>Sample View</h2>

@using ( Html.BeginForm( "YourAction", "YourController" ) )
{
    <div class="container">

    @for ( int i = 0; i < Model.Bars.Count; i++ )
    {
        @Html.TextBoxFor( m => m.Bars[i].Fox )
        @Html.ValidationMessageFor( m => m.Bars[i].Fox );
    }

    </div>
}

这将呈现必要的标签 - 当然还有验证消息位。但是,也可以使用

将所有错误消息组合在一个地方
@Html.ValidationSummary()

如果您确实只想在单击按钮后显示内容,请考虑使用局部视图并加载该视图。这比尝试使用javascript创建所有必要的标签和属性以进行验证要好得多。

此致