2012-05-24 36 views
7

Tôi đã các lớp POCO sau:Mẫu Binding không làm việc

public class Location 
    { 
     public int LocationId { get; set; } 
     public string Name { get; set; } 
     public string Street { get; set; } 
     public string City { get; set; } 
     public string State { get; set; } 
     public string ZipCode { get; set; } 
     public string Country { get; set; } 
     public float? Latitude { get; set; } 
     public float? Longitude { get; set; } 
     public string PhoneNumber { get; set; } 
     public string EmailAddress { get; set; } 
     public string Website { get; set; } 
     public virtual ICollection<Program> Programs { get; set; } 
     public virtual ICollection<PlayerType> PlayerTypes { get; set; } 
    } 

public class PlayerType 
    { 
     public int PlayerTypeId { get; set; } 
     public string Name { get; set; } 
     public int SortOrder { get; set; } 
     public bool IsActive { get; set; } 
     public virtual ICollection<Location> Locations { get; set; } 
    } 

Và một Class Xem Mẫu

public class LocationViewModel 
    { 
     public Location Location { get; set; } 
     public IList<PlayerType> SelectPlayerTypes { get; set; } 

     public LocationViewModel() 
     { 
      Location = new Location(); 
     } 

    } 

Trong Tạo Mẫu của tôi, tôi đã xác định mô hình như

@model Locator.Models.LocationViewModel 

Và có các trường như sau:

div class="editor-label"> 
    @Html.LabelFor(model => model.Location.Name) 
</div> 
<div class="editor-field"> 
    @Html.EditorFor(model => model.Location.Name) 
    @Html.ValidationMessageFor(model => model.Location.Name) 
</div> 

Trong điều khiển của tôi để xử lý các POST Tôi có

[HttpPost] 
     public ActionResult Create(LocationViewModel location) 
     { 
      if (ModelState.IsValid) { 
       locationRepository.InsertOrUpdate(location.Location); 
       locationRepository.Save(); 
       return RedirectToAction("Index"); 
      } 
      location.SelectPlayerTypes = golferTypeRepository.All.Where(p => p.IsActive).ToList(); 
      return View(location); 
     } 

Vấn đề là tôi có một đối tượng Location nhưng không ai trong số các thuộc tính là để thiết lập các giá trị nhập vào biểu mẫu.

Tôi có làm gì sai ở đây không?

Cảm ơn

+0

Tôi có thể tắt, nhưng tôi nghĩ rằng việc khởi tạo 'Vị trí' trong hàm tạo đang ném nó đi. Bạn có thể thử loại bỏ dòng đó (và khởi tạo thuộc tính bên ngoài chính mô hình) không? –

+0

Tôi đã khởi tạo nó trong Create ActionResult (không phải bài đăng) và bây giờ khi tôi đăng bài, Vị trí là null. – Mike

+0

Vâng, đó là những gì tôi hy vọng bạn sẽ thử. Oh well, đoán đó không phải là vấn đề. –

Trả lời

37

Dưới đây là các vấn đề:

[HttpPost] 
public ActionResult Create(LocationViewModel location) 

Bạn có nhìn thấy nó? Đó là tên của đối số hành động của bạn: location.

Nhìn vào mô hình xem bạn bây giờ, nó có một tài sản có tên Location:

public Location Location { get; set; } 

này lẫn lộn mô hình chất kết dính. Nó không còn biết liệu bạn cần phải ràng buộc các LocationViewModel hoặc tài sản của nó.

Vì vậy, chỉ cần đổi tên để tránh những mâu thuẫn:

[HttpPost] 
public ActionResult Create(LocationViewModel model) 
+0

Tôi không thể ngừng cười làm thế nào nó làm tôi cảm thấy đổ cho phút –

+0

Đã xảy ra với tôi quá, câu trả lời tuyệt vời! – Jesse

+1

Tôi đã có một lớp học với mô hình tài sản trong nó để làm/mô hình của một chiếc xe. Tất nhiên tham số truyền của tôi là 'mô hình'. * facepalm * – DataHerder

0

này lưu ngày của tôi. IAd sau:

public ActionResult Edit(int masterId, ConclusionView conclusion) 

ConclusionView có một tài sản mang tên Conclusion vì vậy tôi gần như mất trí của tôi.

30

Chỉ cần đóng góp một lý do khác có thể: Tôi đã dành vài giờ để tìm lỗi trong mã của tôi và lý do khiến tài liệu không hoạt động trong trường hợp của tôi là sử dụng mô hình có trường công khai thay vì thuộc tính công khai:

public int CustomerName; 

và nó sẽ là:

public int CustomerName { get; set; } 

được làm việc trên ASP.NET MVC 3 năm nay và tôi không bao giờ đi qua này trước đây. Hy vọng nó giúp tiết kiệm cho ai đó một số sự thất vọng;)

+0

Mong muốn được cấp - Đã cứu tôi khỏi thổi miếng đệm hôm nay. Tôi có tất cả các lĩnh vực và không có tài sản. Tất cả các liên kết HTML không có chi tiết trong chúng. Cảm ơn bạn đã thêm câu trả lời bổ sung này, @Grzegorz. – edhubbell

+0

Chúa ơi, tôi đã dành rất nhiều thời gian để tìm ra điều này! Cảm ơn bạn! – LukeP

+0

Câu trả lời này cũng đã giúp tôi nhắc nhở rằng các thuộc tính cần được ** công khai **. –

2

Hãy để tôi thêm vào đây để nói một lý do khác tại sao chất kết dính mô hình không hoạt động đúng cách.

Tôi đã có mô hình với thuộc tính ContactPhone, ở đâu đó theo cách tôi quyết định thay đổi tên của thuộc tính này thành Phone, sau đó tất cả mô hình đột ngột ràng buộc cho thuộc tính này ngừng hoạt động khi tôi cố gắng tạo một phiên bản mới .

Sự cố xảy ra với hành động Create trong bộ điều khiển của tôi. Tôi đã sử dụng mặc định Visual Studio giàn giáo và nó đã tạo ra chữ ký phương pháp như thế này:

public ActionResult Create([Bind(Include = "Id,ContactPhone, ...")] Customer customer) 
{ ... } 

Chú ý đến các thuộc tính Bind, các scaffolder tạo các lĩnh vực sử dụng tên gốc ContactPhone và vì đây là một chuỗi, nó không được tái cấu trúc. Vì trường mới Phone không được bao gồm, giá trị của nó bị bỏ qua bởi trình kết nối mô hình.

Tôi hy vọng điều này sẽ tiết kiệm thời gian của ai đó.

Chúc may mắn!

0

Tôi biết đã quá muộn để nhận xét về điều này.Điều tôi đã làm là thêm tham số ít hàm tạo trong ViewModel và mọi thứ hoạt động tuyệt vời.

4

Cũng muộn để tham gia bữa tiệc, nhưng sau 3 năm của asp.net mvc, tôi đã gặp các đầu vào bị vô hiệu hóa không được đăng, do đó, trình kết nối mô hình không thể ràng buộc chúng tất nhiên. Xem here:

"Yếu tố bị vô hiệu trong biểu mẫu sẽ không được gửi".

Sử dụng tốt hơn readonly="readonly" bị tắt. Xem here.

1

Và một lý do khác: Thông thường tôi sử dụng trình chỉnh sửa hoặc hiển thị được tích hợp sẵn và sẽ không bao giờ gặp sự cố này. Tuy nhiên trong trường hợp này tôi yêu cầu một điều khiển bán tùy chỉnh. Về cơ bản thả xuống với nhiều thuộc tính dữ liệu trên các tùy chọn.

Những gì tôi đang làm, cho thẻ chọn của tôi là:

<select name="@Html.IdFor(x => x.SubModel.ID)" id="@Html.IdFor(x => x.SubModel)" class="form-control select-control"> 

Bây giờ mọi thứ đã được đăng lại và để mắt chưa qua đào tạo nó trông giống như tất cả mọi thứ nên làm việc và ràng buộc. Tuy nhiên, trình trợ giúp IdFor hiển thị các mô hình con với dấu gạch dưới. Trình kết nối mô hình không giải thích dấu gạch dưới dưới dạng chỉ báo phân cấp lớp. Điều gì cần được tách chúng là một dấu chấm. Mà đến từ NameFor:

<select name="@Html.NameFor(x => x.SubModel.ID)" id="@Html.IdFor(x => x.SubModel)" class="form-control select-control"> 

NameĐối với tất cả các vấn đề của tôi.

0

Chỉ cần nhắc lại những gì Tod đã nói, trình kết nối mô hình cần một thuộc tính 'tên' trên phần tử HTML để ánh xạ các thuộc tính. Tôi đã làm một mẫu thử nghiệm nhanh chóng bằng tay và chỉ sử dụng thuộc tính 'id' để xác định các phần tử của tôi.

Mọi thứ rơi vào vị trí khi tôi thêm thuộc tính 'tên'.

<input type="text" id="Address" name="Address" /> 
Các vấn đề liên quan