2011-04-01 31 views
6

Tôi đang sử dụng asp.net mvc 3 với xác thực không rõ ràng jquery. Gần đây tôi đã thay đổi từ DataAnnotations chuẩn thành FluentValidation và nó hoạt động tuyệt vời.xác thực khách hàng mvc cho thuộc tính lồng nhau (thu thập)

Lý do chính của tôi khi chọn FluentValidation là xác thực các thuộc tính lồng nhau trên viewmodel của tôi (nhưng tôi thấy có các lý do thú vị khác để sử dụng nó).

class Vm { 
    string Prop; 
    string AnotherProp; 
    IEnumerable<ElementsVm> Elements; 
} 

class ElementsVm { 
    bool Required; 
    string Id; 
    string Title; 
    string Value; 
} 

Sử dụng FluentValidation Tôi làm trình xác nhận cho Vm và cho ElementVm và các bài kiểm tra đơn vị của tôi có màu xanh lá cây, cho thấy xác thực phía máy chủ đang hoạt động.

Phía máy khách, 'Prop' và 'AnotherProp' đang hoạt động - quy tắc xác thực của tôi cũng đang chạy phía máy khách như mong đợi (như với DataAnnontation), nhưng tất cả các yếu tố của tôi không nhận được bất kỳ xác thực phía máy khách nào - Tôi kiểm tra dom và có thể thấy tất cả các thuộc tính data-val, data-required etc. bị thiếu.

Tôi đã thử các cách tiếp cận khác nhau để tạo html trong chế độ xem của tôi, nhưng 'Prop' và 'AnotherProp' được tạo bằng cách sử dụng Html.TextBoxFor (m => m.Prop) trong khi các phần tử của tôi được tạo trong một phần - đây là nơi mà các vấn đề bắt đầu. Nếu tôi chọn Html.TextBoxFor (m => m.Value) tất cả các hộp văn bản Element của tôi sẽ có cùng tên/id, vì vậy tôi cũng đã thử sử dụng Html.TextBox (Model.Id) để tạo id/tên duy nhất nhưng vẫn không có thuộc tính xác nhận .

Vì vậy, có một cách để làm cho senario của tôi hoạt động - tôi không nhớ viết lại nó một chút, nhưng tôi thực sự muốn FluentValidation để viết html của tôi cho tôi.

Giải pháp dự phòng của tôi là tạo người trợ giúp Html để tạo đúng Html với thuộc tính, nhưng điều đó sẽ khiến tôi nghĩ, vì tôi sẽ phải cập nhật những người trợ giúp đó khi bản phát hành/bản vá mới được thực hiện cho FluentValidation, jquery xác nhận hoặc liên kết trong mvc giữa hai.

Trả lời

8

Trong một phần của bạn, trước mỗi thể hiện của ElementsVM, bạn phải thiết lập một tiền tố duy nhất sử dụng ViewData.TemplateInfo.HtmlFieldPrefix, như vậy:

var i = 0; 
foreach (var element in Model) 
{ 
    ViewData.TemplateInfo.HtmlFieldPrefix = "Elements[" + i.ToString() + "]"; 
    @Html.TextBoxFor(m => m.Value) 
    i++; 
} 

này sẽ cho bạn xác nhận không phô trương của mình thuộc tính, và cũng nên làm việc với chất kết dính mô hình mặc định.

counsellorben

+0

Cảm ơn! Tính năng này hoạt động và phải được đánh dấu là câu trả lời. – JustinP8

+1

Ngoài ra, đừng quên đặt lại 'ViewData.TemplateInfo.HtmlFieldPrefix =" "' nếu bạn có đầu vào sau vòng lặp. – JustinP8

+0

@ JustinP8, @counsellorben, @Per: Tôi đang gặp vấn đề tương tự, nhưng điều này không khắc phục được. Tôi đang sử dụng EditorTemplates cho bộ sưu tập lồng nhau của mình và tất cả các thuộc tính 'id' của thẻ 'đầu vào' đã được thêm tiền tố với "Elements [0]" tương ứng/tương ứng. 'ViewData.TemplateInfo.HtmlFieldPrefix' rất hữu ích để biết, nhưng không phải là vấn đề đối với tôi. @Per đã đề cập rằng 'thuộc tính data-val, data-required etc. bị thiếu'. Tôi đã nhận thấy điều tương tự. – tkerwood

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