11

私はカスタム ModelBinders を使用するのは初めてで、見回してきましたが、この特定のケースに関連する投稿が見つかりませんでした。

次のようなエンティティがあります。

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

ビューでは、次のようにバインドします。

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

クラス DynamicDataItems に特定の方法で取得したい特別な情報があるため、独自のモデル バインダーを作成しました。

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 には「DynamicDataItem[0]」が含まれています。

bindingContext.ValueProvider.ContainsPrefix(key) を実行すると true が返されますが、GetValue(key) を実行すると null が返されます。ValueProvider の内容を調べると、"DynamicDataItem[0]" で始まるキーを持つ項目がいくつかあることがわかります。現在バインドされているアイテム (「DynamicDataItem[0]」) のすべてのフィールドから情報を取得するにはどうすればよいですか? それらをすべて1つずつ取得する必要がありますか?このような:

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

これであなたが私に与えることができるガイダンスに大いに感謝します。

4

3 に答える 3

1

問題は、タイプのオブジェクトを入力にバインドしようとしているようDynamicDataItemです。文字列やその他のプリミティブ型ではないためDynamicDataItem、バインダーが入力をどう処理するかを判断する簡単な方法はなく、null が返されます。

クラスに独自のプロパティがあると仮定すると、DynamicDataItemの各プロパティにエディタを提供する必要がありますDynamicDataItem。ビューから子オブジェクトのバインドされたコレクションを含むモデルを渡すだけの場合は、カスタム モデル バインダーも必要ありません。あなたが欲しいと思うのは、あなたの見解の中で、このように読むものです

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

このトピックについて Phil Haack と Scott Hanselman を調べてください。

ここここ

それが役立つことを願っています

于 2012-05-18T05:06:10.853 に答える
1

私はあなたと同じ問題を抱えていました。掘り下げていたときにあなたのページを見つけました。これはあなたにも役立つと思います:):

このリンクを確認した後、基本的にクエリ文字列を解析しようとしています。controllercontext.httpcontext で見つけることができます。

これがあなたに役立つことを願っています

よろしくお願いします

于 2012-06-15T14:05:17.497 に答える