2016-03-07 80 views
0

我正在使用ASP.NET MVC 5並在客戶端希望使用JQuery不顯眼的驗證。ASP.NET MVC自定義驗證列表<string>

以下是我的模型:

public class CompanyModel 
    { 
     public CompanyModel() 
     { 
      Employees = new List<EmployeeModel>();    
     } 
     public int CompanyId{ get; set; } 

     public List<EmployeeModel> Employees { get; set; }   
    } 

    public class EmployeeModel 
    { 
     public EmployeeModel() 
     { 
      Values = new List<string>(); 
     } 

     public string Id { get; set; } 

     public string Name { get; set; } 

     [RequiredIf("IsRequired", true, "Atleast one value is required")] 
     public List<string> Values { get; set; } 

     public bool IsRequired { get; set; } 
    } 

我能夠實現RequiredIf定製服務器端成功屬性。但我努力讓客戶端驗證會...

在通過員工列表視圖我環路和值集合勢必

@for (var index = 0; index < Model.Employees.Count; index++) 
{ 
     /// some other code 

    @for (int i = 0; i < Model.employees[index].Values.Count; i++) 
    { 
     @Html.TextBoxFor(m => m.Employees[index].Values[i], new {@autocomplete = "false" }) 
    }  
} 

的IsRequired屬性是隱藏字段:

@Html.HiddenFor(m => m.Employees[index].IsRequired) 

以下是我目前使用的GetClientValidationRules方法的代碼。

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
      { 
       var rule = new ModelClientValidationRule 
       { 
        ErrorMessage = ErrorMessage, 
        ValidationType = "requiredif" 
       };    

       rule.ValidationParameters["dependentproperty"] = (context as ViewContext).ViewData.TemplateInfo.GetFullHtmlFieldId(DependentProperty); 
       rule.ValidationParameters["dependentpropertyvalue"] = DependentPropertyValue.ToString().ToLower(); 

       yield return rule;    
      } 

我看不到驗證HTML(data-val- *)屬性添加到HTML標記中的值。我不期望他們,因爲我認爲我錯過了一些東西。如何獲取在html中使用data-val-requiredif屬性填充的值集合的所有元素。

任何想法?

供參考:html中的dependentpropertyId填充像EmployeeModel.Employees_0_IsRequired for Employee [0]一樣。

+1

您無法獲取jQuery客戶端端v因爲您無法爲集合生成表單控件(僅針對集合的屬性),因此屬性是集合的alidation。您需要編寫自己的客戶端腳本才能顯示您自己的客戶端消息。 –

+0

好的,謝謝我看到。 @StephenMuecke然後你建議做一些類似於這裏所接受的答案的東西。 http://stackoverflow.com/questions/5662589/unobtrusive-mvc3-validating-group-of-checkboxes或手動添加data-val和data-val-requiredif屬性到html,然後編寫一個jQuery驗證適配器? – user1527762

+0

@Sparky(http://stackoverflow.com/users/594235/sparky)同樣的問題也給你了嗎? – user1527762

回答

1

那裏有小點,包括在驗證屬性GetClientValidationRules()方法,因爲它的目的是將data-val-*屬性添加到該財產所產生的表單控件,廣告不產生財產Values輸入(如果你確實,綁定會失敗)。解決這個問題的一種方法是處理表單.submit()事件,檢查集合中是否至少有一個項目有值,如果不取消提交併顯示錯誤。

修改您的視圖包括驗證消息佔位符,並添加一個類名的輸入,選擇

@for (var index = 0; index < Model.Employees.Count; index++) 
{ 
    .... 
    <div class="value-group"> // necessary for relative selectors 
     @for (int i = 0; i < Model.employees[index].Values.Count; i++) 
     { 
      @Html.TextBoxFor(m => m.Employees[index].Values[i], new { @class="value", autocomplete = "false" }) 
     } 
     @Html.ValidationMessageFor(m => m.Employees[index].Values) 
    </div> 
} 

,幷包括以下腳本

$('form').submit(function() { // use an id selector if you have added one to the form 
    var isValid = true; 
    var groups = $('.value-group'); 
    $.each(groups, function(index, item) { 
     var group = $(this); 
     var inputs = group.find('.value'); 
     if (inputs.filter(function() { return $(this).val().length > 0; }).length == 0) { 
      isValid = false; 
      group.find('span:last').append($('<span></span>').text('At least one value is required')).addClass('field-validation-error').removeClass('field-validation-valid'); 
     } 
    }); 
    return isValid; 
}); 

您可能還需要添加其他腳本來處理每個輸入的更改事件以刪除相關的錯誤消息,如果組中的任何輸入現在具有值

+0

非常感謝。 – user1527762

0

Required驗證只確保該屬性具有值。在類似於List<string>的情況下,僅意味着它不爲空。一個空的列表仍然是一個列表,所以它通過驗證罰款。實際上,您使用的是RequiredIf,並且沒有提供該自定義屬性的實現,但我認爲它基於Required屬性,因爲幾乎所有我見過的實現都是這樣。

總而言之,您需要修改您的RequiredIf實現來考慮列表和其他可枚舉屬性的內容,或者您​​需要添加一些手動驗證來檢查列表中是否至少有一個項目。

+0

是的,我檢查清單上的計數,以確保計數> 0,這是服務器端。我'無法讓客戶端工作。 – user1527762