2017-05-25 41 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