2011-10-06 29 views
6

Tôi đã tạo ra tùy chỉnh của riêng tôi ValidationAttribute:Tuỳ chỉnh ValidationAttribute không bắn IsValid chức năng cuộc gọi theo quan điểm mô hình

public class UrlValidationAttribute : ValidationAttribute 
{ 
    public UrlValidationAttribute() {} 

    public override bool IsValid(object value) 
    { 
     if (value == null) 
      return true; 

     var text = value as string; 
     Uri uri; 

     return (!string.IsNullOrWhiteSpace(text) && 
       Uri.TryCreate(text, UriKind.Absolute, out uri)); 
    } 
} 

Tôi đang sử dụng mà trên một trong những mô hình của tôi và nó hoạt động hoàn hảo. Tuy nhiên, bây giờ tôi đang cố gắng sử dụng nó trên một mô hình điểm:

public class DeviceAttribute 
{ 
    public DeviceAttribute(int id, attributeDefinition, String url) 
    { 
     ID = id; 
     Url = url; 
    } 

    public int ID { get; set; } 

    [UrlValidation] 
    public String Url { get; set; } 
} 

Mô hình điểm được sử dụng trong giao diện phần như thế này:

@model List<ICMDB.Models.DeviceAttribute> 

<table class="editor-table"> 

@foreach (var attribute in Model) 
{ 
    <tr> 

     @Html.HiddenFor(a => attribute.ID) 

     <td class="editor-label"> 
      @Html.LabelFor(a => attribute.Url) 
     </td> 

     <td class="editor-field"> 
      @Html.TextBoxFor(a => attribute.Url)    
      @Html.ValidationMessageFor(a => attribute.Url) 
     </td> 

    </tr> 
} 

</table> 

Đối với một số lý do nào đó, trong khi các nhà xây dựng cho UrlValidationAttribute kích hoạt, hàm IsValid không kích hoạt. Ý tưởng nào?

Chỉnh sửa: Khi điều tra thêm, có vẻ như điều này đang xảy ra vì mô hình xem DeviceAttribute thực sự là mô hình xem cho một phần. Trang đầy đủ được chuyển qua một mô hình chế độ xem khác có chứa danh sách các kiểu xem DeviceAttribute. Vì vậy, khi hành động điều khiển của tôi được gọi, mô hình xem trang đầy đủ được tạo và giá trị của nó được lấp đầy, nhưng không có mô hình xem DeviceAttribute nào được xây dựng, do đó tại sao không xác thực được chạy.

+0

Có lẽ thử trọng @protected ghi đè ValidationResult IsValid (giá trị đối tượng, ValidationContext validationContext) @ - đây là phương pháp cần được overriden cho ValidationAttribute của. NB: Hãy chắc chắn rằng bạn gọi ctor của ValidationResult với các thông tin thành viên được tìm thấy trong bối cảnh xác nhận. –

+0

Đã thử rằng quá, không hoạt động. Tôi nghĩ đó là một cái gì đó để làm với thực tế rằng đây là trong một cái nhìn cục bộ, do đó 'List 'không có được thông qua trở lại với bộ điều khiển để xác nhận ... – link664

Trả lời

-1

tôi sẽ khuyên bạn sử dụng các mẫu biên tập thay vì viết vòng lặp foreach. Tôi giả sử rằng mô hình giao diện chính của bạn trông giống như sau:

public class MyViewModel 
{ 
    public List<DeviceAttribute> Devices { get; set; } 
    ... 
} 

Bây giờ trong giao diện chính của bạn:

@model MyViewModel 
@using (Html.BeginForm()) 
{ 
    <table class="editor-table"> 
     @Html.EditorFor(x => x.Devices) 
    </table> 
    <input type="submit" value="OK" /> 
} 

và trong các mẫu biên tập tương ứng (~/Views/Shared/EditorTemplates/DeviceAttribute.cshtml):

@model DeviceAttribute 
<tr> 
    @Html.HiddenFor(x => x.ID) 

    <td class="editor-label"> 
     @Html.LabelFor(x => x.Url) 
    </td> 

    <td class="editor-field"> 
     @Html.TextBoxFor(x => x.Url)    
     @Html.ValidationMessageFor(x => x.Url) 
    </td> 
</tr> 

Và hành động POST của bạn có quan điểm mô hình trở lại:

[HttpPost] 
public ActionResult Index(MyViewModel model) 
{ 
    ... 
} 

Bây giờ, trình kết nối mô hình mặc định sẽ ràng buộc thành công tất cả các giá trị trong mô hình khung nhìn và xác nhận tính hợp lệ.

Dưới đây là một nice blog post về mẫu.

+0

Các mặt hàng này đã không làm việc. – Bardicer

Các vấn đề liên quan