2011-11-10 14 views
1

私は、元の型を含む隠し値に基づいて適切なモデルのサブタイプを返すために使用しているカスタムモデルバインダーを持っています。多型カスタムモデルバインダーは、値付きのモデルを作成しません。

例えば、私の意見(EditorTemplate)に私が持っている:

@model MyWebApp.Models.TruckModel 
@Html.Hidden("ModelType", Model.GetType()) 
@Html.EditorFor(m => m.CabSize) 

その後、私のカスタムモデルバインダーでは、私が持っている:typeValuetype変数に設定得ている

protected override object CreateModel(ControllerContext controllerContext, 
     ModelBindingContext bindingContext, Type modelType) 
    { 
     var typeValue = bindingContext.ValueProvider 
      .GetValue(bindingContext.ModelName + ".ModelType"); 

     var type = Type.GetType((string)typeValue.ConvertTo(typeof(string)), true); 

     var model = Activator.CreateInstance(type); 

     bindingContext.ModelMetadata = ModelMetadataProviders.Current 
      .GetMetadataForType(() => model, type); 

     return model; 
    } 

適切な値(タイプはTruckModel)ですが、GetMetadataForTypeの後には、modelにはヌル/デフォルト値が入力されます。

私はいくつかの投稿(herehere)をチェックして、ここで説明したようにすべてをやっているようですが、それでも私のためには機能しません。

ビュー/モデルの設定の詳細は、このトピックの「previous post」を参照してください。

+1

私はこの段階でデフォルト値を期待していると思います.GetPropertyValueを呼び出すと、モデルに実際にビューの値が入力された後にのみ、そのメソッドを実行していますか? – sydneyos

+0

@sydneyos - そうです、この時点で値は設定されていないはずです。私はこれが私のコントローラ(無関係な例外 'ArgumentNullException'、しかし私は関係していたと思った)にそれを作った前に例外がスローされたためこれを見ることができませんでした。私はこの問題を修正した後、それをコントローラに送りました。あなたが言ったように、私のモデルにはこの時点でデータが入力されていました。これを回答として投稿することができれば、私はそれを受け入れます。ありがとう。 –

答えて

0

コメントの上に@sydneyosが記載しているように、私のモデルには実際にデータが取り込まれていますが、明らかにCreateModelメソッドでは、返されたモデルにその時点の値は含まれません。

私の場合、この方法に続いてArgumentNullExceptionが表示されていましたが、このモデルではモデルが作成されなかったためです。しかし、それは無関係であり、いったんこれが修正されると、モデルバインディングは期待どおりに機能しました。

関連する問題