1. ホーム
  2. c#

[解決済み] bindingContext.ModelNameが空ですか?

2022-01-30 03:39:45

質問

を適用しようとしています。 Darin Dimitrovの回答 しかし、私の実装では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 関数は失敗します。

解決方法は?

は必要ないと思います。 bindingContext.ModelName プロパティを使用することができます。

で行く。 Darin Dimitrovの回答 は、以下のように試すことができるようです。 まず、フォームにタイプ用の隠しフィールドが必要です。

@using (Html.BeginForm("UrunEkle", "Yonetici")) {
    @Html.Hidden("UrunType", Model.Urun.GetType())

そして、モデルバインディングで(基本的にDarin Dimitrovからコピーしたものです)。

protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
{
    var typeValue = bindingContext.ValueProvider.GetValue("UrunType");
    var type = Type.GetType(
        (string)typeValue.ConvertTo(typeof(string)),
        true
    );
    var model = Activator.CreateInstance(type);
    bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => model, type);
    return model;
}

参照 この記事 の詳細については bindingContext.ModelName が入力されます。