値を選択しないためのDropDownList


83

編集ページ内でDropDownListForヘルパーメソッドを使用していますが、指定した値を選択することができません。Stackoverflowで同様の質問に気づきました。推奨される回避策は、「ビューコードにSelectListを入力する」ことでした。問題は、私がすでにこれを試したのに、まだ機能していないことです。

<%= Html.DropDownListFor(model => model.States, new SelectList(Model.States.OrderBy(s => s.StateAbbr), "StateAbbr", "StateName", Model.AddressStateAbbr), "-- Select State --")%>

ブレークポイントを設定し、model.AddressStateAbbrの存在(および有効性)を確認しました。何が欠けているのかよくわかりません。

回答:


182

1時間調べたところ、選択したものがに設定されない原因となっている問題が見つかりましたDropDownListFor。その理由は、モデルのプロパティと同じViewBagの名前を使用しているためです。

public  class employee_insignia
{ 
   public int id{get;set;}
   public string name{get;set;}
   public int insignia{get;set;}//This property will store insignia id
}

// If your ViewBag's name same as your property name 
  ViewBag.Insignia = new SelectList(db.MtInsignia.AsEnumerable(), "id", "description", 1);

見る

 @Html.DropDownListFor(model => model.insignia, (SelectList)ViewBag.Insignia, "Please select value")

選択したオプションはドロップダウンリストに設定されませんが、ViewBagの名前を別の名前に変更すると、選択したオプションが正しく表示されます。

ViewBag.InsigniaList = new SelectList(db.MtInsignia.AsEnumerable(), "id", "description", 1);

見る

 @Html.DropDownListFor(model => model.insignia, (SelectList)ViewBag.InsigniaList , "Please select value")

34
これは実際には正解です!!! グーグルをしているすべての人にとって、ViewBagプロパティにmodelプロパティと同じ名前を付けないように注意してください。これが問題になるとはまったく思っていませんでしたが、実際には修正されました。私はショックを受けています。
Tesserex 2012年

10
ViewBagプロパティの名前がモデルプロパティとは異なる場合でも、同じ問題が発生します。– @Html.DropDownListFor(model => model.Title, (SelectList)ViewBag.Salutation, Resources.Labels.Unknown )
Paul Taylor

8
彼らが同じになれない理由を誰かが知っていますか?この答えは私のラップトップが壊されるのを
防ぎました

7
わかりません。私もこの問題を抱えており、ViewBagを使用していません。また、質問はViewBagを使用していませんでした
George Mauer

3
これはASP.NETMVCのバグだと思います。
ネスターサンチェスA.

30

試してみてください:

<%= Html.DropDownListFor(
    model => model.AddressStateAbbr,
    new SelectList(
        Model.States.OrderBy(s => s.StateAbbr),
        "StateAbbr",
        "StateName",
        Model.AddressStateAbbr), "-- Select State --")%>

またはRazor構文の場合:

@Html.DropDownListFor(
    model => model.AddressStateAbbr,
    new SelectList(
        Model.States.OrderBy(s => s.StateAbbr),
        "StateAbbr",
        "StateName",
        Model.AddressStateAbbr), "-- Select State --")

式ベースのヘルパーは、SelectList内のSelectListItemsのSelectedプロパティを尊重していないようです。


ありがとう!データベースリポジトリから選択した値を取得する簡単な方法が必要でした!Model.AddressStateAbbrは私が必要とした部分でした。甘い。もう一度ありがとう
トムスティッケル2011

30

これらすべてのViewBag変人とは異なり、適切に実行してモデルを使用しているにもかかわらず問題が発生する場合は、の選択肢と@Html.DropDownListFor(m => m.MyValue, @Model.MyOptions)一致MyValueしないことが原因MyOptionsです。その2つの潜在的な理由は次のとおりです。

  1. MyValue無効です。ViewModelに設定していません。のいずれかを作成しMyOptionsても、Selected=trueこれは解決されません。
  2. さらに微妙に、のタイプはのタイプMyValueは異なりMyOptionsます。のように、MyValue(int) 1、あなたMyOptionsがパディングされた文字列のリストである場合、それは{"01", "02", "03", ...}明らかに何も選択しません。

4
この回答をありがとうございました。また、誰もが適切なビューモデルを作成する代わりにViewBagを使用している理由もわかりません。この答えは私を正面から見つめていました。点をつなげてくれてありがとう。
あいまいさ

2
#2ここに私の問題があります。メソッドの名前を取り、デリゲート署名に一致する事前定義されたメソッド呼び出しのリストから実際にそのメソッドをバインドするカスタムモデルバインダーを持つデリゲートタイプであるモデルプロパティがあります。誰かが#2を回避し、ハッキーなクライアント側のスクリプトなしで正しく選択することを見つけましたか?
mikeschuld 2017年

1
ビューモデルを使用する別のヒップスターからの感謝:D
Vladimir Bozic 2017年

1
また、オプションタグ間の表示テキストとは異なる値属性を持つSelectListを持っている人には、たとえば次のようになり<option value="2">some text</option>ます。選択したオプションを選択するために、value属性ではなく、ビューモデルプロパティを表示テキストと実際に一致させようとしているように見えます。これは私にしばらく行ってもらいました。
ジェイソンハンソン

17

この質問に対処していませんが、将来のグーグルが私の思考経路をたどれば役立つかもしれません:

複数選択が必要でしたが、DropDownListForでのこの属性ハックは自動選択ではありませんでした

Html.DropDownListFor(m => m.TrainingLevelSelected, Model.TrainingLevelSelectListItems, new {multiple= "multiple" })

代わりに、すべてが機能するListBoxForを使用する必要がありました

Html.ListBoxFor(m => m.TrainingLevelSelected, Model.TrainingLevelSelectListItems)

6
私はあなたの思考の道をたどった。世界:DropDownListForと複数を使用している場合は、ListBoxForを使用することを意味します。
スコットスタッフォード

これが機能するのは面倒です。私のコードの別の場所では、すべてが同じで、DropDownListForは正常に機能します。私はそれを機能させるためにこれで遊んで4〜5時間を費やしました。私の最後の溝はこれでした、そしてそれは働きました。
ブライアンホブス2017年

1

私も同様の問題を抱えており、次のように解決し、

コントローラのmodel.Statesプロパティを、選択する必要のあるものに変更します

model.States = "カリフォルニア"

次に、デフォルト値として「California」を取得します。


0

この問題は一般的です。ビューバッグのプロパティ名を、ページで使用されているモデル変数名以外に変更します。


0

すべてが独自のコードではないかどうかを確認するもう1つのことは、ページの読み込み時に値を変更するjavascript関数がないことを確認することです。これらすべての解決策を読んで壁に頭をぶつけて何時間も過ごした後、私はこれが私に起こっていることであることに気づきました。


0

最近この問題が発生しました。それは私を約1時間怒らせた。私の場合、モデルプロパティと同じ名前の変数を使用していませんでしたViewBag

ソース管理の変更を追跡した後、問題は私のことであることが判明したアクションが持っていた同じ名前の引数をモデルプロパティとして:

public ActionResult SomeAction(string someName)
{
    var model = new SomeModel();
    model.SomeNames = GetSomeList();
    //Notice how the model property name matches the action name
    model.someName = someName; 
}

ビューで:

@Html.DropDownListFor(model => model.someName, Model.SomeNames)

アクションの引数を別の名前に変更しただけで、再び機能し始めました。

public ActionResult SomeAction(string someOtherName)
{
    //....
}

モデルのプロパティ名も変更できると思いますが、私の場合、引数名は無意味なので...

うまくいけば、この答えは他の誰かのトラブルを救うでしょう。


0

少なくとも私にとっての問題は、に結びついていましたIEnumerable<T>

基本的に何が起こったのかというと、ビューとモデルが同じプロパティに対して同じ参照を持っていなかったということです。

これを行う場合

IEnumerable<CoolName> CoolNames {get;set;} = GetData().Select(x => new CoolName{...});}

次に、を使用してこれをバインドします

@Html.DropDownListFor(model => model.Id, Model.CoolNames)

ビューはCoolNamesプロパティを追跡できなくなります。簡単な修正は.ToList()、投影を実行した後に追加すること.Select()です();)。


0

私も同じ問題を抱えていました。以下の例では、変数ViewData ["DATA_ACREDITO_MODELO_INTEGRADO"]には、デフォルトの選択値を持つSelectListItemリストがありますが、そのような属性は視覚的に反映されません。

// data 
        var p_estadoAcreditacion = "NO";
        var estadoAcreditacion = new List<SelectListItem>();
        estadoAcreditacion.Add(new SelectListItem { Text = "(SELECCIONE)"    , Value = " "    });
        estadoAcreditacion.Add(new SelectListItem { Text = "SI"              , Value = "SI"   });
        estadoAcreditacion.Add(new SelectListItem { Text = "NO"              , Value = "NO"   });

        if (!string.IsNullOrEmpty(p_estadoAcreditacion))
        {
            estadoAcreditacion.First(x => x.Value == p_estadoAcreditacion.Trim()).Selected = true;
        }
         ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] = estadoAcreditacion;

DropdownListの最初の引数をid属性とは異なるものにすることで、これを解決しました。

// error:
@Html.DropDownList("SELECT__ACREDITO_MODELO_INTEGRADO"
, ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] as List<SelectListItem>
, new
{
id         = "SELECT__ACREDITO_MODELO_INTEGRADO"
...
// solved :
@Html.DropDownList("DROPDOWNLIST_ACREDITO_MODELO_INTEGRADO"
, ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] as List<SelectListItem>
, new
{
id         = "SELECT__ACREDITO_MODELO_INTEGRADO"

..。


0

これは古い質問ですが、2020年も同じ問題を抱えています。

モデルプロパティの名前が「Title」であることが問題であることが判明しました。名前を「GivenTitle」に変更すると、期待どおりに機能するようになりました。

から

Html.DropDownListFor(m => m.Title, Model.Titles, "Please Select", new { @class = "form-control" })

Html.DropDownListFor(m => m.GivenTitle, Model.GivenTitles, "Please Select", new { @class = "form-control" })
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.