2012-02-07 30 views
10

Tôi mới sử dụng ModelBinders tùy chỉnh, tôi đã tìm kiếm và tôi không thể tìm thấy bất kỳ bài đăng nào liên quan đến trường hợp cụ thể này.MVC 3.0 ModelBinder bindingContext.ValueProvider.GetValue (khóa) trả về null khi liên kết trong bộ sưu tập

Tôi có một thực thể như:

public class DynamicData 
    { 
     public IList<DynamicDataItem> DynamicDataItems{get;set;} 
    } 

Trong Xem i ràng buộc nó thích sau:

@Html.EditorFor(model => model.DynamicDataItems); 

Tôi có thông tin đặc biệt trong DynamicDataItems lớp, mà tôi muốn lấy trong một cách cụ thể, vì vậy tôi đã tạo ra Binder Model của riêng tôi.

public class DynamicDataItemBinder : IModelBinder 
    { 
     public object BindModel(ControllerContext controllerContext, 
      ModelBindingContext bindingContext) 
     { 
      var key = bindingContext.ModelName; 
      var valueProviderResult = bindingContext.ValueProvider 
       .GetValue(key); 

      if (valueProviderResult == null || 
       string.IsNullOrEmpty(valueProviderResult 
        .AttemptedValue)) 
      { 
       return null; 
      } 

      //Here retrieve my own Information 

      return DynamicDataItem; 
     } 
    } 

bindingContext.ModelName chứa "DynamicDataItem [0]".

Nếu tôi thực hiện bindingContext.ValueProvider.ContainsPrefix (khóa), nó trả về true, nhưng khi tôi thực hiện GetValue (khóa), nó trả về giá trị rỗng. Nếu tôi kiểm tra những gì ValueProvider chứa, tôi thấy rằng có một số mục với khóa bắt đầu của họ trong "DynamicDataItem [0]". Làm cách nào để tôi lấy được thông tin từ tất cả các trường cho Hạng mục đang bị ràng buộc hiện tại ("DynamicDataItem [0]")? Tôi có nên truy xuất tất cả từng cái một không? Như sau:

var result1= bindingContext.ValueProvider.GetValue("DynamicDataItem[0].Id"); 
var result2= bindingContext.ValueProvider.GetValue("DynamicDataItem[0].Name"); 

Tôi sẽ đánh giá cao bất kỳ hướng dẫn nào bạn có thể cho tôi điều này.

+0

Tôi khuyên bạn nên truy cập [liên kết này] [1]. Tôi nghĩ nó hữu ích cho vấn đề của bạn. [1]: http://stackoverflow.com/a/25902872/1817640 – Jahan

Trả lời

1

Sự cố có vẻ là bạn đang cố gắng ràng buộc một đối tượng thuộc loại DynamicDataItem vào đầu vào. Kể từ DynamicDataItem không phải là một chuỗi hoặc một số loại nguyên thủy khác, không có cách nào đơn giản cho các chất kết dính để tìm ra những gì để làm với đầu vào của bạn và nó trả về null.

Giả sử lớp DynamicDataItem có các thuộc tính của riêng nó, những gì bạn muốn làm là cung cấp trình chỉnh sửa cho mỗi thuộc tính của DynamicDataItem. Nếu tất cả những gì bạn đang cố gắng làm là chuyển một mô hình với một tập hợp các đối tượng con bị ràng buộc từ một khung nhìn, bạn thậm chí không cần một bộ mô hình tùy chỉnh. Những gì tôi nghĩ rằng bạn muốn là một cái gì đó theo quan điểm của bạn mà đọc giống như

<input type="text" name="DynamicDataItem[0].SomeTextField" /> 
<input type="text" name="DynamicDataItem[0].SomeOtherTextField" /> 

Kiểm tra này ra Phil Haack và Scott Hanselman về chủ đề này

HereHere

Tôi hy vọng rằng sẽ giúp

1

Tôi đã có same issue như bạn và khi tôi đang đào tôi tìm thấy trang của bạn và tôi nghĩ rằng điều này có thể giúp bạn quá :):

Sau khi xem xét this link hãy cho tôi ý tưởng: về cơ bản, đang cố gắng phân tích cú pháp chuỗi truy vấn. Bạn có thể tìm thấy nó trong controllercontext.httpcontext.

hy vọng rằng điều này sẽ giúp bạn

Trân trọng

0

Tôi biết đây là bài cũ nhưng tôi có cùng một vấn đề và giải pháp của tôi là sử dụng BindingContext.ModelName:

ValueProviderResult result = bindingContext.ValueProvider.GetValue(propertyDescriptor.Name); 
if(result == null) 
    result = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + "." + propertyDescriptor.Name); 
Các vấn đề liên quan