2009-03-17 57 views
27

[Tôi giải quyết này bản thân mình, xem câu trả lời của tôi cho nguyên nhân]ASP.NET MVC model binding một IList <> tham số

Tôi đang gặp khó khăn về giá trị hình thức cho một IList <> lập luận trong một phương pháp điều khiển đặt đúng.

lớp điều khiển của tôi trông như thế này:

public class ShoppingBasketController : Controller { 

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

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Add(IList<ShoppingBasketItem> items) { 
     Session["basket"] = items; // for testing 
     return RedirectToAction("Index"); 
    } 
} 
public class ShoppingBasketItem { 
    public int ItemID; 
    public int ItemQuantity; 
} 

Dạng hơi tỉa:

<% using (Html.BeginForm("Add", "ShoppingBasket")) { %> 
    <% int codeIndex = 0; 
    foreach (Product product in products) { %> 
     <%= Html.Hidden("items[" + codeIndex + "].ItemID", product.Id) %> 
     <%= Html.TextBox("items[" + codeIndex + "].ItemQuantity", "0", new { size = "2"}) %> 
     <% codeIndex++; 
    } 
} %> 

nào sản xuất đánh dấu như:

<form action="/Basket/Add" method="post"> 
    <input id="items[0]_ItemID" name="items[0].ItemID" type="hidden" value="1" /> 
    <input id="items[0]_ItemQuantity" name="items[0].ItemQuantity" size="2" type="text" value="0" /> 

    <input id="items[1]_ItemID" name="items[1].ItemID" type="hidden" value="2" /> 
    <input id="items[1]_ItemQuantity" name="items[2].ItemQuantity" size="2" type="text" value="0" /> 

    <input id="items[2]_ItemID" name="items[2].ItemID" type="hidden" value="3" /> 
    <input id="items[2]_ItemQuantity" name="items[2].ItemQuantity" size="2" type="text" value="0" /> 
</form> 

Tôi đã kiểm tra các giá trị hình thức mà được gửi và chúng đúng. Số lượng chính xác của ShoppingBasketItem cũng được đưa vào Session["basket"], tuy nhiên cả hai ItemIDItemQuantity của mỗi số đều bằng không. Dường như nó giải mã chính xác danh sách các giá trị biểu mẫu, nhưng không tự mình chọn lên các thuộc tính.

Tôi đang sử dụng MVC RC2 và dựa trên số article by Scott Hanselman Tôi chắc chắn rằng mã của tôi là chính xác. Tui bỏ lỡ điều gì vậy?

+0

Có cách nào để làm cho công việc này với giao diện người dùng mẫu, sử dụng một EditorFor (m => m.product) cho mỗi lần lặp lại trong Sản phẩm? –

+0

Cảm ơn. Tôi thấy điều này thực sự hữu ích. :) –

Trả lời

35

Giải pháp

Sau khi tải về các nguồn MVC tôi vẫn không thể hiểu tại sao nó sẽ không làm việc, vì vậy tôi cho là nó phải có cái gì để làm với các loại tôi đã cố gắng để ràng buộc. Chắc chắn, các giá trị là biến thành viên, trái ngược với các thuộc tính, là thủ phạm. Điều này là do chất kết dính mô hình sử dụng sự phản chiếu để thiết lập các thuộc tính, mà nó không tìm thấy thông qua cuộc gọi đến TypeDescriptor.GetProperties(Type).

Cập nhật lớp giá trị này giải quyết nó (sau giờ đánh đầu tắt tường tôi nên thêm !!):

public class ShoppingBasketItem { 
    public int ItemID { get; set; } 
    public int ItemQuantity { get; set; } 
} 
+0

Tôi đã luôn luôn nghe nói rằng các biến thành viên công cộng không phải là nhị phân tương đương với tài sản công cộng (nó là một thay đổi phá vỡ), và bây giờ tôi đoán tôi là thuyết phục. –

+0

Đây là ví dụ hoàn chỉnh duy nhất tôi đã tìm thấy. Tất cả các bài đăng trên blog khác đều có các phần của toàn bộ bức tranh. –

+0

Cảm ơn bạn rất nhiều! Tôi đã đập đầu của tôi trên bàn trong nhiều giờ cố gắng tìm ra những gì đã sai. – Giablo

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