验证列表中的第一个元素

时间:2014-01-31 11:17:44

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 razor model-validation

我有像这样的viewmodel

public class MyViewModel
{
    public List<string> SubSiteNames { get; set; }
}

在视图中我这样做

    @for (int i = 1; i <= 3; i++)
    {
        <label>Name </label>
        @Html.TextBoxFor(m => m.SubSiteNames[i - 1])
    }

验证的问题。我需要第一个元素。我怎么能实现它?

注意:

我想提供验证。当用户点击提交时,第一个文本框中会出现“需要名称”的消息

2 个答案:

答案 0 :(得分:1)

您可以为CustomDataAnnotation List没有第一个元素null

public class MustHaveFirstElementAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        var list = value as IList;
        if (list != null)
        {
            return list[0] != null;
        }
        return false;
    }
}

      [MustHaveFirstElementAttribute (ErrorMessage = "First Element is required")]
        public List<YourClass> SubSiteNames{ get; private set; }

如果你想用jquery

 @for (int i = 1; i <= 3; i++)
    {
        <label>Name </label>
        @Html.TextBoxFor(m => m.SubSiteNames[i - 1],new { id="site"+i.ToString()})
    }

然后在jquery中提交

    $("#submit").click(function(e){

     if($("site1").val()=="")
       {
         alert("Invalid");
        e.preventDefault();
       }
});

答案 1 :(得分:0)

仅制作集合中的第一个项目有点复杂。我建议您为此创建一个单独的属性并根据需要进行标记:

  

视图模型

public class MyViewModel
{
    [Required]
    public string RequiredName { get; set; }
    public List<string> SubSiteNames { get; set; }
}
  

查看

<label>Name </label>
@Html.TextBoxFor(m => m.RequiredName)
@Html.ValidationMessageFor(m => m.RequiredName)
@for (int i = 1; i <= 3; i++)
{
    <label>Name </label>
    @Html.TextBoxFor(m => m.SubSiteNames[i - 1])
}

然后,只需从SubSiteNames列表中删除第一项,然后将其设置为RequiredName