2009-12-24 3 views
9

Tôi đang cố gắng nâng cấp dự án MVC 1 của tôi lên MVC 2 RC. Chúng tôi hiện có một modelbinder tùy chỉnh có thêm các mục vào ValueProvider (điều này làm việc khi nó là một từ điển). Sau đó, chúng tôi chuyển thông tin này cho modelbinder mặc định. Tuy nhiên, IValueProvider không có phương thức bổ sung, do đó thuật toán này không còn hoạt động nữa. Có ai biết một cách để thêm giá trị cho ValueProvider trong MVC 2?ASP.NET MVC 2 - Thiết lập giá trị trên IValueProvider

foreach(string valKey in controllerContext.RequestContext.HttpContext.Request.Form.AllKeys.Where(x => x.StartsWith(valuesToChangePrefix))) 
{ 
    string valName = valKey.Substring(valuesToChangePrefix.Length); 

    string myVal = ManipulateValue(bindingContext.ValueProvider.GetValue(valKey).AttemptedValue); 

    // This is where I need to add to my value Provider (As you can see I used to just assign a ValueProviderResult 
    //bindingContext.ValueProvider = new ValueProviderResult(myVal.Split(','), myVal, bindingContext.ValueProvider.GetValue(valKey).Culture); 
} 
+2

Cùng một vấn đề tại thời điểm này, tôi không thể tìm thấy bất kỳ tài liệu phong nha nào về cách triển khai trình kết nối mô hình tùy chỉnh cho MVC2 ở bất cứ đâu –

Trả lời

2

Vấn đề là vào thời điểm bạn nhận được để các ModelBinder, ValueProvider của bạn đã được thiết lập. Trước đây, bạn có thể thêm giá trị vào ValueProvider của bạn tại thời điểm này.

Để cung cấp Custom ValueProvider, bạn cần ghi đè lên ControllerActionInvoker, đây là giải pháp tối ưu. Thật không may là ControllerActionInvoker được tạo bởi đối tượng Controller, thay vì được tiêm. Vì vậy, bạn cũng cần phải ghi đè lên Controller để gọi ControllerActionInvoker của riêng bạn.

+2

Dường như thực sự có giải pháp dễ dàng hơn. Bạn có thể chỉ cần tạo ValueProvider của riêng bạn và thêm nó vào bộ sưu tập ValueProviderFactories.Factories tĩnh trong Application_Start. –

0

Bạn không thể sử dụng một trong các loại có nguồn gốc IValueProvider? (hoặc thậm chí tạo của riêng bạn, nhưng có vẻ là thực hiện phong nha trong khuôn khổ)

ValueProviderDictionary. ValueProviderCollection, FormCollection (và một vài thứ khác) tất cả đều thực hiện IValueProvider.

Tôi không chắc liệu nó có giúp ích hay không. Tôi không hoàn toàn chắc chắn về những gì bạn đang cố gắng làm. Tôi đã không phải đối phó với trộn lẫn với các params bài đó nhiều.

+0

Bạn có thể sử dụng loại IValueProvider có nguồn gốc, nhưng bạn phải kết nối thêm đường ống. –

+0

Hai loại đầu tiên không được chấp nhận. – Martin

+0

Trang MSDN có nghĩa là 'ValueProviderDictionary' không được dùng nữa, nhưng tôi không thấy nó nói' ValueProviderCollection' là gì? – Funka

0

Tôi có thể khiến bạn nhầm, nhưng tiền tố này bạn đang sử dụng là gì? Điều đó có liên quan đến mối quan hệ trẻ em của mô hình của bạn không?

Nếu không, tại sao không lấy được từ số DefaultModelBinder và ghi đè phương thức BindModel()? Bằng cách đó, bạn có thể gọi base.BindModel() và thao tác các giá trị sau đó, tuy nhiên bạn không thể sử dụng xác thực mẫu sau đó (đảm bảo bạn đọc http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html, vì sẽ có thay đổi đáng kể trong bản phát hành so với RC).

Cách tiếp cận sạch hơn, từ những gì tôi có thể đoán bạn cố gắng làm, là sử dụng ViewModel trong trường hợp này. Do thao tác có lẽ không tầm thường, bạn có thể muốn tách biệt xác thực đầu vào và mô hình từ nhau.

Không chắc chắn nếu điều này giúp một trong hai ...

+0

Về cơ bản, tôi đang cố gắng giải mã các giá trị có một tiền tố nhất định. Chúng tôi đang cố gắng để làm cho nó để ViewModels của chúng tôi không biết về giải mã - họ chỉ có một int và theo thời gian nó được cho họ nó đã được giải mã. Vì vậy, không có điều này không giải quyết được vấn đề. –