2017-05-25 34 views
2

我有具有与其关联的自定义属性方法的组列表。它似乎没有捕获屏幕上的验证错误。但是在控制器上,它将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> 
+0

一个验证属性需要实现'IClientValidatable',你需要编写客户端验证jQuery方法。但你不能做到这一点与集合,因为你不能为一个集合的形式控制(集合中只有对象的属性) –

+0

@StephenMuecke但我得到的错误在ModelState.Valid。那么有没有一种方法可以在视图本身中捕获它,而不必等待提交? –

+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,因此他们失败的验证和因此会显示范围验证程序错误消息。

-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