2010-08-25 23 views
10

tôi đang cố gắng để ràng buộc một mảng động của các yếu tố để một mô hình điểm nơi có thể có thiếu chỉ số trong htmlmảng Binding với các yếu tố còn thiếu trong asp.net MVC

ví dụ với mô hình xem

class FooViewModel 
{ 
    public List<BarViewModel> Bars { get; set; } 
} 

class BarViewModel 
{ 
    public string Something { get; set; } 
} 

và html

<input type="text" name="Bars[1].Something" value="a" /> 
<input type="text" name="Bars[3].Something" value="b" /> 
<input type="text" name="Bars[6].Something" value="c" /> 

vào lúc này, thanh sẽ chỉ được null. làm thế nào tôi có thể nhận được các mô hình chất kết dính để bỏ qua bất kỳ yếu tố mất tích? tức là ở trên sẽ liên kết với:

FooViewModel 
{ 
    Bars 
    { 
      BarViewModel { Something = "a" }, 
      BarViewModel { Something = "b" }, 
      BarViewModel { Something = "c" } 
    } 
} 

Trả lời

5

Thêm .Index như đầu tiên của bạn đầu vào bị ẩn để xử lý các phần tử chuỗi được giải thích trong trường hợp này Phil Haacked blog bài đăng:

<input type="text" name="Bars.Index" value="" /> 
<input type="text" name="Bars[1].Something" value="a" /> 
<input type="text" name="Bars[3].Something" value="b" /> 
<input type="text" name="Bars[6].Something" value="c" /> 
+3

Rất gần, nhưng câu trả lời được chấp nhận trong url này có giải pháp hoàn chỉnh hơn: http://stackoverflow.com/questions/8598214/mvc3-non-sequential-indices-and-defaultmodelbinder – Levitikon

+0

@Levitikon - Giải pháp được chấp nhận trong liên kết của bạn là quá mức cần thiết. Bạn không cần phải chỉ định '.Index' cho mỗi mục. Tôi đã sử dụng cách tiếp cận trên nhiều lần mà không cần thêm các đầu vào ẩn được mô tả trong liên kết của bạn. Thêm vào đó, Phil Haack đã tham gia vào đội ngũ phát triển ASP.NET MVC, vì vậy tôi khá chắc chắn những gì anh ấy viết trong blog của anh ấy là con đường để đi. – amurra

+1

@amurra trong bài viết của Haack ông nói để sử dụng một đầu vào riêng biệt ẩn cho mỗi trường để có vẻ như nó là cần thiết. – Mykroft

-1

Tôi thậm chí không biết rằng đã hoạt động!

mang ý nghĩ đó, id đã làm một cái gì đó như:

<input type="text" name="Bars.Something" value="a" /> 
<input type="hidden" name="Bars.Something" value="" /> 
<input type="text" name="Bars.Something" value="b" /> 
<input type="hidden" name="Bars.Something" value="" /> 
<input type="hidden" name="Bars.Something" value="" /> 
<input type="text" name="Bars.Something" value="c" /> 

mà hy vọng sẽ gửi

a,,b,,,c 

nhưng tôi nghi ngờ rằng sẽ ràng buộc trong cùng một cách như bạn mô tả

Bạn có thể sẽ phải viết một chất kết dính mô hình tùy chỉnh tìm kiếm chỉ mục tối đa, tạo danh sách kích thước đó rồi đặt các phần tử vào đúng vị trí.

Nói hết, chờ cho người khác để gửi một thuộc tính thực sự đơn giản, bạn có thể đặt trên tài sản của mình mà làm cho nó chỉ làm việc; D

0

MVC có thể cư danh sách riêng của mình.

public ActionResult Index(FooViewModel model) 
{ 
    ... 

Vì vậy, không có vấn đề nếu bất cứ điều gì là mất tích MVC sẽ tạo mới List<BarViewModel> và cho mỗi chỉ số tìm thấy - [1], [3], [6] nó sẽ tạo ra mới BarViewModel và thêm nó vào danh sách. Vì vậy, bạn sẽ nhận được FooViewModel với các Bars được điền.

+0

Có và không. Có vẻ như MVC dừng xây dựng mảng khi có một khoảng trống trong chuỗi. – Levitikon

0

Sự chỉnh sửa có thể để nhanh chóng các ViewModel và bộ sưu tập cho đúng kích thước (giả sử nó được biết đến), sau đó cập nhật nó với TryUpdateModel ... cái gì đó như:

[HttpPost] 
    public ActionResult SomePostBack(FormCollection form) 
    { 
     // you could either look in the formcollection to get this, or retrieve it from the users' settings etc. 
     int collectionSize = 6; 

     FooViewModel bars = new FooViewModel(); 
     bars.Bars = new List<BarViewModel>(collectionSize); 
     TryUpdateModel(bars, form.ToValueProvider()); 

     return View(bars); 
    }H 
Các vấn đề liên quan