2009-08-11 69 views
5

Tôi có các lớp mô hình trong LINQ-to-Sql với các lớp một phần được đánh dấu bằng các thuộc tính chú thích dữ liệu và tham chiếu đến xVal.ASP.NET MVC Model/ViewModel Validation

Khi tôi liên kết chế độ xem trực tiếp với mô hình, mọi thứ hoạt động tốt, cả JS được tạo bởi xVal và kiểm tra đôi bên máy chủ.

Nhiều chế độ xem của tôi không đưa đầu vào vào một mô hình cụ thể, vì vậy tôi đang thiết lập các lớp mô hình xem. Thay vì phơi bày toàn bộ một cá thể mô hình, tôi trưng ra các thuộc tính vào mô hình mà tôi cho phép/cần được thiết lập bởi khung nhìn.

// foo model 
public class Foo { 
    public string FooField { ... } 
    public Bar Bar { ... } 
} 

// bar model, where bar is a parent relationship of foo in the db 
public class Bar { 
    public string BarField { ... } 
} 

// view model stuff 
public class FooViewModel { 
    private Foo foo; 

    public FooViewModel() { 
     foo = new Foo() { Bar = new Bar() }; 
    } 

    public Foo Model { 
     get { return foo; } 
     set { foo = value; } 
    } 

    public string BarField { 
     get { return foo.Bar.BarField; } 
     set { foo.Bar.BarField = value; } 
    } 

    public string ExtraViewModelField { 
     get; set; 
    } 
} 

Cách tiếp cận này sẽ điền chính xác lớp mô hình xem và kho lưu trữ có thể điền chính xác bản ghi.

Tuy nhiên, tính năng này không vượt qua quá trình xác thực. Tôi đã xem mã khách hàng phát ra và mảng xác nhận là rỗng cho xval. Ngoài ra, kiểm tra phía máy chủ cho IsValid luôn đúng.

Tôi có thể thu thập chú thích dữ liệu hay không mặc dù thuộc tính của mô hình xem để xác thực như thế này hoặc tôi có nên thực hiện theo cách khác không?

+0

hãy đánh dấu câu trả lời cho câu hỏi này nếu câu trả lời cho câu hỏi của bạn –

Trả lời

0

Bạn có thể đăng mã trợ giúp xval và một số Html.Helpers không?

Phải có thực thể và tiền tố, vì vậy tôi không thấy lý do cấu trúc bên trong mô hình chế độ xem của bạn nên tạo ra bất kỳ sự khác biệt nào. Một cái gì đó như:

<%= Html.ClientSideValidation<Foo>("Foo") %> 
<%= Html.ClientSideValidation<Bar>("Foo.Bar") %> 

James

+0

Tôi không có mã chính xác trước mặt mình, nhưng tôi có một cái gì đó như, <% = Html.ClientSideValidation ()%>, hoạt động khi nó là . Vì cuộc gọi IsValid ở phía máy chủ không hoạt động chính xác hoặc tôi nghĩ rằng vấn đề chú thích của nó không phải là vấn đề xval, nhưng có thể bị nhầm lẫn. – blu

4

Nếu bạn sử dụng partials, và vượt qua trong subtype, bạn vẫn cần phải hội đủ điều kiện. Xem như sau:

<%@ Control Language="C#" 
        Inherits="System.Web.Mvc.ViewUserControl<MvcWeb.Models.OrderDetail>" %> 

<% using (Html.BeginForm()) { %> 

    <fieldset> 
     <legend>Fields</legend> 
      <%= Html.Hidden("OrderId", Model.OrderId) %> 
      <%= Html.Hidden("ProductId", Model.ProductId)%> 
     <p> 
      <label for="Quantity">Quantity:</label> 
      <%= Html.TextBox("OrderDetails.Quantity", Model.Quantity)%> 
      <%= Html.ValidationMessage("OrderDetails.Quantity", "*") %> 
     </p> 
     <p> 
      <input type="submit" value="Save" /> 
     </p> 
    </fieldset> 

<% } %> 

Lưu ý rằng loại này là OrderDetails, nhưng tôi vẫn tiếp tục xử lý thông báo xác thực.

+1

Tôi gặp vấn đề tương tự. – hminaya

0

Nếu tôi đọc chính xác, bạn đang đặt DataAnnotations trên lớp LINQ to sql rồi điền các thuộc tính viewmodel của bạn với các thuộc tính từ lớp linq sang sql.

Để làm việc này với xval, bạn cần đặt các chú thích dữ liệu trên thuộc tính mô hình chế độ xem. Theo như tôi có thể nói từ xvals mã nó không nhìn xa hơn các tài sản công cộng cho bất kỳ thông tin xác nhận (ai đó xin vui lòng sửa tôi nếu im sai ở đây).

Nếu bạn muốn xác minh minh bạch giữa mô hình và dạng xem, bạn có thể đi xuống tuyến đường sử dụng postsharp để ràng buộc các thuộc tính nhưng điều này có thể là rất nhiều công việc để đạt được ít nếu chương trình của bạn nhỏ.