2009-02-27 37 views
12

Tôi muốn nhận được một số ràng buộc làm việc trong ứng dụng mvc của tôi. Tôi tìm thấy thuộc tính lồng nhau không tự động bị ràng buộc bởi các chất kết dính mô hình mặc định trong việc phát hành RC1 của asp.net MVC. Tôi có cấu trúc lớp sau:Mô hình ràng buộc các thuộc tính lồng nhau trong asp.net mvc

public class Contact{ 
    public int Id { get; set; } 
    public Name Name { get; set; } 
    public string Email { get; set; } 
} 

đâu Name được định nghĩa là:

public class Name{ 
    public string Forename { get; set; } 
    public string Surname { get; set; } 
} 

Quan điểm của tôi được xác định dọc theo dòng:

using(Html.BeginForm()){ 
    Html.Textbox("Name.Forename", Model.Name.Forename); 
    Html.Textbox("Name.Surname", Model.Name.Surname); 
    Html.Textbox("Email", Model.Email); 
    Html.SubmitButton("save", "Save"); 
} 

controller action của tôi được định nghĩa là:

public ActionResult Save(int id, FormCollection submittedValues){ 
    Contact contact = get contact from database; 
    UpdateModel(contact, submittedValues.ToValueProvider()); 

    //at this point the Name property has not been successfully populated using the default model binder!!! 
} 

Thuộc tính Email bị ràng buộc thành công nhưng không phải là thuộc tính Name.Forename hoặc Name.Surname. Bất cứ ai có thể cho biết nếu điều này nên làm việc bằng cách sử dụng chất kết dính mô hình mặc định và tôi đang làm điều gì sai hoặc nếu nó không hoạt động và tôi cần phải cuộn mã của riêng tôi để ràng buộc thuộc tính lồng nhau trên các đối tượng mô hình?

Trả lời

9

Tôi nghĩ rằng vấn đề là do tiền tố Tên trên các thuộc tính. Tôi nghĩ rằng bạn sẽ cần phải cập nhật nó như hai mô hình và chỉ định tiền tố cho mô hình thứ hai. Lưu ý rằng tôi đã xóa số FormCollection khỏi các tham số và sử dụng chữ ký UpdateModel dựa trên nhà cung cấp giá trị được tạo sẵn và chỉ định danh sách trắng các thuộc tính cần xem xét.

public ActionResult Save(int id) 
{ 
    Contact contact = db.Contacts.SingleOrDefault(c => c.Id == id); 

    UpdateModel(contact, new string[] { "Email" }); 
    string[] whitelist = new string[] { "Forename", "Surname" }; 
    UpdateModel(contact.Name, "Name", whitelist); 
} 
+0

Điều này hoạt động tuyệt vời, Cảm ơn tvanfosson. –

+0

SingleOrDefault có thể được gọi trực tiếp với biểu thức lamda –

+0

@PhilippM bạn hoàn toàn đúng, cập nhật! – tvanfosson

4

Thats rất thú vị bởi vì nếu bạn đã làm

public ActionResult Save(int id, Contact contact) 
{ 
    //contact here would contain the nested values. 
} 

Tôi đang sử dụng này với thành công rực rỡ. Tôi giả sử sau đó bạn bằng cách nào đó có thể đồng bộ hóa hai đối tượng Liên hệ với nhau.

Tôi đã nghĩ rằng UpdateModel và ràng buộc tham số sử dụng cùng một cuộc gọi sau hậu trường. lưu ý: chưa cố gắng tái tạo sự cố của bạn.

3

Để ràng buộc Tên thay vì toàn bộ mô hình chế độ xem trên POST là hướng dẫn mô hình kết dính rằng tiền tố sẽ được sử dụng. Điều này được thực hiện bằng cách sử dụng BindAttribute.

public ActionResult AddComment([Bind(Prefix = "Name")] Name name) 
{ 
    //do something 
} 
Các vấn đề liên quan