9

MVC1プロジェクトをMVC2RCにアップグレードしようとしています。現在、ValueProviderにアイテムを追加するカスタムmodelbinderがあります(これは辞書の場合に機能しました)。次に、これをデフォルトのmodelbinderに渡しました。ただし、IValueProviderにはaddメソッドがないため、このアルゴリズムは機能しなくなります。MVC 2のValueProviderに値を追加する方法を知っている人はいますか?

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);
}
4

3 に答える 3

2

問題は、ModelBinderに到達するまでに、ValueProviderがすでに設定されていることです。以前は、この時点でValueProviderに値を追加できました。

カスタムValueProviderを提供するには、究極のソリューションであるControllerActionInvokerをオーバーライドする必要があります。残念ながら、ControllerActionInvokerは、注入されるのではなく、Controllerオブジェクトによって作成されます。したがって、独自のControllerActionInvokerを呼び出すには、Controllerをオーバーライドする必要もあります。

于 2010-01-25T16:58:01.873 に答える
0

IValueProviderの派生タイプの1つを使用できませんか?(または独自に作成することもできますが、フレームワークには適切な実装があるようです)

ValueProviderDictionaryValueProviderCollectionFormCollection(およびその他のいくつか)はすべてIValueProviderを実装します。

それが役立つかどうかはわかりません。私はあなたが何をしようとしているのか完全にはわかりません。投稿パラメータとの混同にそれほど対処する必要はありませんでした。

于 2010-01-25T15:45:46.030 に答える
0

おそらくあなたは間違っていますが、あなたが使用しているこのプレフィックスは何ですか?それはあなたのモデルの子関係に関係していますか?

そうでない場合は、から派生してメソッドDefaultModelBinderをオーバーライドしませんか?BindModel()そうすれば、後で値を呼び出しbase.BindModel()て操作できますが、モデル検証を使用することはできません(http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-を必ずお読みください)検証-in-aspnet-mvc.html、リリースとRCで大幅な変更があるため)。

あなたがやろうとしていることから、よりクリーンなアプローチは、この場合はViewModelを使用することです。操作はおそらく簡単ではないため、入力とモデルの検証を互いに分離することをお勧めします。

これがどちらかを助けるかどうかわからない...

于 2010-01-25T16:08:13.423 に答える