列表验证(数据注释)无法在客户端

时间:2017-05-25 21:44:06

标签: c# asp.net-mvc validation data-annotations

我有一个组列表,其中包含与之关联的自定义属性方法。它似乎没有捕获屏幕上的验证错误。但是在控制器上,它将ModelState.Valid设为false。有没有办法在视图中捕获它,而不是必须去服务器端然后我捕获并显示它? 其他验证工作正常,因此不会丢失jquery文件。

型号:

   [RequiredList(ErrorMessage = "The {0} field is required.")]
    [Display(Name = "Selected Organization(s)")]
    public List<OrganizationDTO> Organizations { get; set; }

自定义属性:

public class RequiredListAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        var list = value as IList;
        if (list != null)
        {
            return list.Count > 0;
        }
        return false;
    }
}

查看:

<div class="form-group">
     <div class="controls">
          <label class="control-label" for="Selected Groups">Selected Group(s)</label>
               <div class="panel panel-default">
                     <div class="panel-body"  style="overflow-y: auto; max-height: 100px; min-height:50px" id="divSelGroups">
                          @for (int i = 0; Model.Groups!= null && i < Model.Groups.Count(); i++)
                          {
                             var group= Model.Groups[i];
                             var checkedAttr = (group.Id != Guid.Empty) ? "checked='checked'" : "";
                              <div class="row">
                                        <input type="hidden" name="Groups.Index" value="@i" />
                                        <input type="hidden"name="Groups[@i].Name" value="@group.Name" />
                                        <input type="hidden" name="Groups[@i].Data" value="@group.Data" />
                                        <div class="col-xs-1">
                                            <input type="checkbox" name="Groups[@i].Id" value="@group.Id" @checkedAttr data-org-selected="true" />
                                        </div>
                                        <div class="col-xs-11" data-toggle="tooltip" data-placement="top" title="@group.Data">@group.Name</div>
                                </div>
                           }
                     </div>
                  </div>
                  @Html.ValidationMessageFor(m => m.Groups)
          </div>
   </div>

2 个答案:

答案 0 :(得分:2)

我必须包含一个解决方法才能使其正常工作,但是如果不回答我原来的问题仍然会解决问题的要求。我不得不引入一个隐藏的文本框,其中包含列表项的数量,并在其上放置范围验证器。

型号:

    [Range(1, double.MaxValue, ErrorMessage = "Atleast one organization needs to be selected.")]
    public int OrgCount { get; set; }

查看:

 @Html.TextBoxFor(m => m.OrgCount, new { style="visibility:hidden;height:0"})
 @Html.ValidationMessageFor(m => m.OrgCount)

JS脚本:

var orgCount = $(".panel-body  input[name='Organizations.Index']").last().val();
if (isNaN(orgCount))
    orgCount = -1;
$("#OrgCount").val(parseInt(orgCount) + 1);

所以基本上如果没有元素我将其设为0,因此它们无法通过验证,因此会显示范围验证器错误消息。

答案 1 :(得分:-2)

根据上述信息,当验证在控制器中正常工作但它在视图中不起作用时,问题可能与jquery验证文件有关。

所以在你的视图中,如果你没有引用jquery文件,那么引用它如下:

<script src="/Scripts/jquery.unobtrusive-ajax.js"></script>
<script src="/Scripts/jquery.validate.js"></script>
<script src="/Scripts/jquery.validate.unobtrusive.js"></script>

还要确保您的webconfig文件中有以下条目:

<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />

希望以上信息有用,请将您的想法或反馈告诉我

由于

KARTHIK