2009-12-24 22 views
9

我試圖將我的MVC 1項目升級到MVC 2 RC。我們現在有一個自定義的模型綁定器,它將項目添加到ValueProvider中(當它是一本字典時,它可以工作)。然後我們將其傳遞給默認的模型綁定器。但是,IValueProvider沒有添加方法,因此此算法不再有效。有誰知道在MVC 2中爲ValueProvider添加值的方法嗎?ASP.NET MVC 2 - 在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

目前同樣的問題,我找不到任何體面的文檔介紹如何爲任何地方的MVC2實現自定義模型綁定器 – 2010-01-05 21:04:37

回答

2

的問題是,你到ModelBinder的時候,你的ValueProvider已經設置。以前,您可以在此時將值添加到您的ValueProvider。

爲了提供自定義ValueProvider,您需要重寫ControllerActionInvoker,這是最終的解決方案。不幸的是,ControllerActionInvoker是由Controller對象創建的,而不是被注入。因此,您還需要重寫Controller以調用您自己的ControllerActionInvoker。

+2

看起來實際上有一個更簡單的解決方案。您可以簡單地創建自己的ValueProvider並將其添加到Application_Start中的靜態ValueProviderFactories.Factories集合中。 – 2010-01-26 13:35:38

0

您不能使用IValueProvider的派生類型之一嗎? (或者甚至創建你自己的,但框架中似乎有體面的實現)

ValueProviderDictionaryValueProviderCollection,FormCollection(以及更多)他們都實現IValueProvider

我不確定它是否有幫助。我不完全確定你想要做什麼。我不必處理混淆後的參數。

+0

您可以使用派生類型的IValueProvider,但您必須將其連接到管道。 – 2010-01-25 16:59:00

+0

前兩個已被棄用。 – Martin 2010-02-16 11:31:03

+0

MSDN頁面確實表示'ValueProviderDictionary'已被棄用,但我沒有看到它說'ValueProviderCollection'是什麼? – Funka 2010-05-21 19:29:25

0

我可能弄錯了,但是你使用的是什麼前綴?這與你的模型的孩子關係有關嗎?

如果沒有,爲什麼不從DefaultModelBinder派生並覆蓋BindModel()方法?這樣,您可以撥打base.BindModel()並在之後操作這些值,但是您無法使用模型驗證(請確保您閱讀http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html,因爲版本與RC的版本會有顯着變化)。

從我猜測你試圖做的更乾淨的方法是在這種情況下使用ViewModel。由於操作可能不平凡,您可能需要將輸入和模型驗證彼此分開。

不知道這是否有助於要麼...

+0

基本上,我試圖解密具有特定前綴的值。我們正在試圖讓我們的ViewModel不知道解密 - 他們只是有一個int,並且到達它們的時候它已經被解密了。所以,這不能解決問題。 – 2010-01-25 17:00:35