2010-10-13 43 views
7

Có vẻ như những người khác đã gặp sự cố này nhưng tôi dường như không thể tìm ra giải pháp.DefaultModelBinder không ràng buộc mô hình lồng nhau

tôi có 2 mô hình: Người & BillingInfo:

public class Person 
{ 
public string Name { get; set;} 
public BillingInfo BillingInfo { get; set; } 
} 

public class BillingInfo 
{ 
public string BillingName { get; set; } 
} 

Và tôi đang cố gắng để ràng buộc này thẳng vào hành động của tôi bằng cách sử dụng DefaultModelBinder.

public ActionResult DoStuff(Person model) 
{ 
// do stuff 
} 

Tuy nhiên, trong khi thuộc tính Person.Name được đặt thì BillingInfo luôn là rỗng.

Bài viết của tôi trông như thế này:

"Name = statichippo & BillingInfo.BillingName = statichippo"

Tại sao BillingInfo luôn null?

Trả lời

5

Trạng thái không repro. Vấn đề của bạn là ở nơi khác và không thể xác định được nơi bạn đã cung cấp thông tin. Trình kết nối mô hình mặc định hoạt động hoàn toàn tốt với các lớp lồng nhau. Tôi đã sử dụng nó một vô số lần và nó đã luôn luôn làm việc.

mẫu:

public class Person 
{ 
    public string Name { get; set; } 
    public BillingInfo BillingInfo { get; set; } 
} 

public class BillingInfo 
{ 
    public string BillingName { get; set; } 
} 

Bộ điều khiển:

[HandleError] 
public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new Person 
     { 
      Name = "statichippo", 
      BillingInfo = new BillingInfo 
      { 
       BillingName = "statichippo" 
      } 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(Person model) 
    { 
     return View(model); 
    } 
} 

Xem:

<% using (Html.BeginForm()) { %> 
    Name: <%: Html.EditorFor(x => x.Name) %> 
    <br/> 
    BillingName: <%: Html.EditorFor(x => x.BillingInfo.BillingName) %> 
    <input type="submit" value="OK" /> 
<% } %> 

giá trị đăng: Name=statichippo&BillingInfo.BillingName=statichippo là hoàn toàn bị ràng buộc trong hành động POST. Cùng làm việc với GET là tốt.


Một trường hợp có thể khi điều này có thể không hoạt động như sau:

public ActionResult Index(Person billingInfo) 
{ 
    return View(); 
} 

Thông báo như thế nào thông số hành động được gọi là billingInfo, cùng tên là BillingInfo tài sản. Hãy chắc chắn rằng đây không phải là trường hợp của bạn.

+0

Bạn nói đúng. Hóa ra HTML của tôi có vấn đề và xuất ra: – hackerhasid

+0

nhập sớm;) - "Tên = statichippo & BillingInfo = & BillingInfo.BillingName = statichippo" – hackerhasid

+0

Tôi gặp vấn đề tương tự với loại lồng nhau không bị ràng buộc. Hóa ra tôi cũng gặp vấn đề với HTML của mình. Tôi có 2 nút radio trong đó tên giống với tên thuộc tính trên mô hình chế độ xem của tôi. Giá trị nút radio cũng được đăng, do đó, trình kết nối mô hình mặc định bị lẫn lộn. –

0
public class MyNestedClass 
{ 
    public string Email { get; set; } 
} 

public class LoginModel 
{ 
//If you name the property as 'xmodel'(other than 'model' then it is working ok. 
public MyNestedClass xmodel {get; set;} 

//If you name the property as 'model', then is not working 
public MyNestedClass model {get; set;} 

public string Test { get; set; } 
} 

Tôi đã gặp vấn đề tương tự. Tôi đã dành nhiều giờ và tìm ra vấn đề vô tình mà tôi không nên sử dụng 'mô hình' cho tên thuộc tính

@Html.TextBoxFor(m => m.xmodel.Email) //This is OK 
@Html.TextBoxFor(m => m.model.Email) //This is not OK 
6

Tôi có vấn đề này, và câu trả lời đang nhìn chằm chằm vào mặt tôi trong một vài giờ. Tôi bao gồm nó ở đây bởi vì tôi đã tìm kiếm các mô hình lồng nhau không ràng buộc và đi đến câu trả lời này.

Đảm bảo rằng các thuộc tính của mô hình lồng nhau của bạn, giống như bất kỳ mô hình nào mà bạn muốn gắn kết hoạt động, có các trình truy cập chính xác.

// Will not bind! 
    public string Address1; 
    public string Address2; 
    public string Address3; 
    public string Address4; 
    public string Address5; 


    // Will bind 
    public string Address1 { get; set; } 
    public string Address2 { get; set; } 
    public string Address3 { get; set; } 
    public string Address4 { get; set; } 
    public string Address5 { get; set; } 
+0

Tôi kiểm tra lại và chế độ xem của tôi cũng thiếu {get; bộ; } - có một số loại mù khiến chúng ta không nhìn thấy điều này! – niico

0

Tôi gặp vấn đề tương tự, nhà phát triển trước đó trong dự án đã đăng ký tài sản với người đặt riêng vì anh ấy không sử dụng chế độ xem này ở chế độ xem lại.Một cái gì đó như thế này:

public MyViewModel NestedModel { get; private set; } 

thay đổi như sau:

public MyViewModel NestedModel { get; set; } 
1

Đây là những gì làm việc cho tôi.

tôi đã thay đổi này:

[HttpPost] 
    public ActionResult Index(Person model) 
    { 
     return View(model); 
    } 

Để:

[HttpPost] 
    public ActionResult Index(FormCollection fc) 
    { 
     Person model = new Person(); 
     model.BillingInfo.BillingName = fc["BillingInfo.BillingName"] 

     /// Add more lines to complete all properties of model as necessary. 

     return View(model); 
    } 
+0

Làm việc cho tôi. Cảm ơn vì giải pháp đó. – Sam

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