0

コンマ区切りのリストを取得し、空の値を消去してから、デフォルトのモデル バインダーに渡すカスタム モデル バインダーがあります。これは ASP.NET MVC Preview 2 で機能しましたが、RC2 にアップグレードすると、ValueProvider のインターフェイスには GetValue() メソッドしかなく、[] アクセサーがないため、以下はコンパイルされません。以下で行っていることは、バインディング コンテキストの他のメカニズムを通じて可能ですか? このような単純な状況では、本格的なモデル バインダーを作成する必要はありません。主な目標は、値が List<SomeEnum> にバインドされるときであり、空の値はスキップされます。

public class EnumListModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var result = bindingContext.ValueProvider[bindingContext.ModelName];
        string[] rawValues = (string[])result.RawValue;
        var newValues = new List<string>();
        foreach (string value in rawValues)
        {
            if (!String.IsNullOrEmpty(value))
            {
                newValues.Add(value);
            }
        }

        string newValuesAttempted = String.Join(",", newValues.ToArray());
        // overwrite the ValueProviderResult with the cleaned up csv list
        // this is the part I'm not sure how to implement using the interface
        bindingContext.ValueProvider[bindingContext.ModelName] = 
           new ValueProviderResult(newValues.ToArray(), newValuesAttempted, result.Culture);

        return System.Web.Mvc.ModelBinders.Binders.DefaultBinder.BindModel(controllerContext, bindingContext);
    }
}
4

2 に答える 2

1

正確には、ここGetValue()の代わりに使用することの何が問題になって[]いますか?同じことをします。しかしValueProvider、現在はインターフェースであり、インターフェースにインデクサーを含めることはできません。したがって、GetValue()

コードを次のように変更します。

var result = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

しかし、次の行のキャストがこれまでに機能したことに少し驚いています。ユーザーが実際に送信する内容と特定のプロパティタイプに大きく依存しているようです。しかし、それはあなたの質問とは無関係です。

于 2010-02-25T14:20:26.790 に答える
0

ValueProvider コレクションが読み取り専用であるため、解決策はあまりありませんでした。代わりに、カスタムモデルバインダーを使用することになりました

List<Enum> にバインドするときに DefaultModelBinder に空の項目を無視させる方法はありますか

于 2010-03-01T17:47:08.907 に答える