私は、元の型を含む隠し値に基づいて適切なモデルのサブタイプを返すために使用しているカスタムモデルバインダーを持っています。多型カスタムモデルバインダーは、値付きのモデルを作成しません。
例えば、私の意見(EditorTemplate)に私が持っている:
@model MyWebApp.Models.TruckModel
@Html.Hidden("ModelType", Model.GetType())
@Html.EditorFor(m => m.CabSize)
その後、私のカスタムモデルバインダーでは、私が持っている:typeValue
とtype
変数に設定得ている
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
にはヌル/デフォルト値が入力されます。
私はいくつかの投稿(hereとhere)をチェックして、ここで説明したようにすべてをやっているようですが、それでも私のためには機能しません。
ビュー/モデルの設定の詳細は、このトピックの「previous post」を参照してください。
私はこの段階でデフォルト値を期待していると思います.GetPropertyValueを呼び出すと、モデルに実際にビューの値が入力された後にのみ、そのメソッドを実行していますか? – sydneyos
@sydneyos - そうです、この時点で値は設定されていないはずです。私はこれが私のコントローラ(無関係な例外 'ArgumentNullException'、しかし私は関係していたと思った)にそれを作った前に例外がスローされたためこれを見ることができませんでした。私はこの問題を修正した後、それをコントローラに送りました。あなたが言ったように、私のモデルにはこの時点でデータが入力されていました。これを回答として投稿することができれば、私はそれを受け入れます。ありがとう。 –