だから私はDarinDimitrovの答えを適用しようとしていますが、私の実装ではbindingContext.ModelNameは""に等しいです。
これが私のビューモデルです:
public class UrunViewModel
{
public Urun Urun { get; set; }
public Type UrunType { get; set; }
}
モデルタイプを投稿するビューの一部は次のとおりです。
@model UrunViewModel
@{
ViewBag.Title = "Tablo Ekle";
var types = new List<Tuple<string, Type>>();
types.Add(new Tuple<string, Type>("Tuval Baskı", typeof(TuvalBaski)));
types.Add(new Tuple<string, Type>("Yağlı Boya", typeof(YagliBoya)));
}
<h2>Tablo Ekle</h2>
@using (Html.BeginForm("UrunEkle", "Yonetici")) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Tablo</legend>
@Html.DropDownListFor(m => m.UrunType, new SelectList(types, "Item2", "Item1" ))
そして、これが私のカスタムモデルバインダーです:
public class UrunBinder : DefaultModelBinder
{
protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type type)
{
var typeValue = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + ".Urun");
var model = Activator.CreateInstance((Type)typeValue.ConvertTo(typeof(Type)));
bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => model, type);
return model;
}
}
最後に、Global.asax.csの行:
ModelBinders.Binders.Add(typeof(UrunViewModel), new UrunBinder());
ここでオーバーライドされた関数の内部で、デバッグモードでは、それが「」に等しいCreateModel
ことがわかります。bindingContext.ModelName
また、typeValue
nullであるため、CreateInstance
関数は失敗します。