Html.DropdownListFor選択された値が設定されていません


97

Html.DropDownListForの選択した値を設定するにはどうすればよいですか?私はオンラインで見てきましたが、次のように4番目のパラメーターを使用することでそれを実現できることを確認しました。

@Html.DropDownListFor(m => m, new SelectList(Model, "Code", "Name", 0),  "Please select a country")

私の選択リストは次のように表示されます:

<select id="ShipFromCountries" name="ShipFromCountries">
     <option value="">Please select a country</option>
     <option value="GB">United Kingdom</option>
     <option value="US">United States</option>
     ...
</select>

でもなんらかの理由でイギリスが選ばれたままですが、「国を選んでください」を選んで欲しいです。

誰でも私がこれを達成する方法を知っていますか?

編集する

機能にわずかな変更があったため、コードを更新しましたが、まだこの問題が発生しているようです。これは私の見解です:

@Html.DropDownListFor(n => n.OrderTemplates, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")

1option選択したいのIDです。テキストも試してみましたが、optionこれも機能しません。

何か案は?

回答:


181

あなたのコードにはいくつかの概念的な問題があります:

まず

@Html.DropDownListFor(n => n.OrderTemplates, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")

DropDownListForを使用する場合、最初のパラメーターは、フォームを送信すると選択した値が格納されるプロパティです。したがって、あなたの場合、SelectedOrderIdこのように使用するには、モデルの一部として、またはそのようなものが必要です:

@Html.DropDownListFor(n => n.SelectedOrderId, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")

第二に

ViewBagの使用は別として、それは間違いではありませんが、より良い方法(代わりにViewModelにその情報を入れる)があります。SelectListを保持しているViewBagプロパティが選択した値を入力したプロパティと同じ名前。これを回避するには、アイテムのリストを保持するプロパティに名前を付けるときに、別の名前を使用します。

この問題を回避し、より優れたMVCコードを作成するために私が使用するいくつかのコード:

ビューモデル:

public class MyViewModel{
   public int SelectedOrderId {get; set;}
   public SelectList OrderTemplates {get; set;}

   // Other properties you need in your view
}

コントローラ:

public ActionResult MyAction(){
   var model = new MyViewModel();
   model.OrderTemplates = new SelectList(db.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1);
   //Other initialization code

   return View(model);
}

あなたの見解では:

@Html.DropDownListFor(n => n.SelectedOrderId, Model.OrderTemplates, "Please select an order template")

42
私の日を保存しました:「... SelectListを保持しているViewBagプロパティが、選択した値を配置したプロパティの名前と同じである場合、小さなバグがあります。これを回避するには、プロパティの名前を付けるときに別の名前を使用してくださいアイテムのリスト。」ありがとうございました!
Michael A. Volz、別名Flynn

4
この「小さなバグ」は絶対狂気です!これが原因で、私の人生の2時間を無駄にしただけです。どうしてそんなに明白なものがまだ存在していてパッチを当てられないのでしょうか?
2015年

1
フリン、あなたのコメントは実際には答えになるはずだ。私はドロップダウン
Dwayne

2
小さなバグはありますか?まったくバグではありません。モデルバインディングは、プロパティの値にバインドすることによって、およびtypeofでOrderTemplatesあるViewBagプロパティにバインドしようとするときにバインドするときに機能しますIEnumerabe<SelectListItem>。ただし、<select>要素は複合オブジェクトのコレクション(値タイプのみ)にバインドできません

この答えがなければ、一日中無駄になっていたでしょう。真剣にリトルバグはビューバッグを保釈すべき理由です
Worthy7

22

私にとっては働いていなかったので、このように働きました:

コントローラ:

int selectedId = 1;

ViewBag.ItemsSelect = new SelectList(db.Items, "ItemId", "ItemName",selectedId);

見る:

@Html.DropDownListFor(m => m.ItemId,(SelectList)ViewBag.ItemsSelect)

jQuery:

$("document").ready(function () {
    $('#ItemId').val('@Model.ItemId');
});

2
コントローラーの括弧の数が間違っています:1つの開き括弧と2つの閉じ括弧があります。
Amos Long

jQueryロジックは私にとってはうまくいきます。ありがとうございました。
Shashank

7

次のようなオブジェクトを渡すと、

new SelectList(Model, "Code", "Name", 0)

あなたが言っている:ソース(Model)とキー("Code")テキスト("Name")と選択した値0。プロパティの0ソースに値がない可能Code性があるため、HTMLヘルパーは最初の要素を選択して、実際のselectedValueをこのコントロールに渡します。


3

割り当てる前に、選択した値をトリムしていることを確認してください。

//モデル

public class SelectType
{
    public string Text { get; set; }
    public string Value { get; set; }
}

//コントローラ

var types = new List<SelectType>();
types.Add(new SelectType() { Value =  0, Text = "Select a Type" });
types.Add(new SelectType() { Value =  1, Text = "Family Trust" });
types.Add(new SelectType() { Value =  2, Text = "Unit Trust"});
ViewBag.PartialTypes = types;

//見る

@Html.DropDownListFor(m => m.PartialType, new SelectList(ViewBag.PartialTypes, "Value", "Text"), new { id = "Type" })

2

ビューの内容がわかっている場合は、view / cshtmlファイルに設定するのではなく、コントローラーからデフォルト値を設定することもできます。 HTML側からデフォルト値を設定する必要はありません。

Controllerファイル内。

commission.TypeofCommission = 1;
return View(commission);

.cshtmlファイル内。

@Html.DropDownListFor(row => row.TypeofCommission, new SelectList(Model.commissionTypeModelList, "type", "typeName"), "--Select--")

1

あなたはクラスを忘れるべきです

SelectList

これをコントローラーで使用してください

var customerTypes = new[] 
{ 
    new SelectListItem(){Value = "all", Text= "All"},
    new SelectListItem(){Value = "business", Text= "Business"},
    new SelectListItem(){Value = "private", Text= "Private"},
};

値を選択します。

var selectedCustomerType = customerTypes.FirstOrDefault(d => d.Value == "private");
if (selectedCustomerType != null)
    selectedCustomerType.Selected = true;

リストをViewDataに追加します。

ViewBag.CustomerTypes = customerTypes;

これをビューで使用します

@Html.DropDownList("SectionType", (SelectListItem[])ViewBag.CustomerTypes)

-

詳細:http : //www.asp.net/mvc/overview/older-versions/working-with-the-dropdownlist-box-and-jquery/using-the-dropdownlist-helper-with-aspnet-mvc



0

私にとっては一般的な解決策:)

@{
     var selectedCity = Model.Cities.Where(k => k.Id == Model.Addres.CityId).FirstOrDefault();
     if (selectedCity != null)
     { 
         @Html.DropDownListFor(model => model.Addres.CityId, new SelectList(Model.Cities, "Id", "Name", selectedCity.Id), new { @class = "form-control" })
     }
     else
     { 
         @Html.DropDownListFor(model => model.Cities, new SelectList(Model.Cities, "Id", "Name", "1"), new { @class = "form-control" })
     }
}

0

空のアイテム、選択されたアイテムのあるドロップダウンへのLinq(100%動作)
(強く入力された、エラー最小の可能性)モデルの変更はバインディングに反映されます

コントローラ

public ActionResult ManageSurveyGroup()
    {
        tbl_Survey sur = new tbl_Survey();
        sur.Survey_Est = "3";

        return View(sur);
    }

見る

        @{


    //Step One : Getting all the list
    var CompEstdList = (from ComType in db.tbl_CompEstdt orderby ComType.Comp_EstdYr select ComType).ToList();

    //Step Two  : Adding a no Value item **
    CompEstdList.Insert(0, new eDurar.Models.tbl_CompEstdt { Comp_Estdid = 0, Comp_EstdYr = "--Select Company Type--" });

    //Step Three : Setting selected Value if value is present
    var selListEstd= CompEstdList.Select(s => new SelectListItem { Text = s.Comp_EstdYr, Value = s.Comp_Estdid.ToString() });

        }
        @Html.DropDownListFor(model => model.Survey_Est, selListEstd)
        @Html.ValidationMessageFor(model => model.Survey_Est)

データをバインドするこの方法も可能です

var selList = CompTypeList.Select(s => new SelectListItem { Text = s.CompTyp_Name, Value = s.CompTyp_Id.ToString(), Selected = s.CompTyp_Id == 3 ? true : false });

var selList = CompTypeList.Select(s => new SelectListItem {Text = s.CompTyp_Name、Value = s.CompTyp_Id.ToString()、Selected = s.CompTyp_Id == 3?true:false});

0

これは実際には質問への回答ではないことはわかっていますが、この投稿を偶然見つけたときに、ビューのオンザフライのリストからDropDownListを初期化する方法を探していました。

私の間違いは、次のような辞書からSelectListを作成しようとしたことです。

//wrong!
@Html.DropDownListFor(m => m.Locality, new SelectList(new Dictionary<string, string>() { { Model.Locality, Model.Locality_text } }, Model.Locality, ...

次に、公式のmsdn docを掘り下げて調べたところ、DropDownListFor必ずしもが必要でSelectListはなく、IEnumerable<SelectListItem>

//right
@Html.DropDownListFor(m => m.Locality, new List<SelectListItem>() { new SelectListItem() { Value = Model.Locality, Text = Model.Locality_text, Selected = true } }, Model.Locality, new { @class = "form-control select2ddl" })

私の場合Model.Locality、選択された項目として、a)のみを除外することもできSelectListItem.Selectedます。これは、a)が唯一の項目であり、b)すでにプロパティで指定されているためです。

ご参考までに、データソースはAJAXページであり、SelectWoo / Select2コントロールを使用して動的に読み込まれます。


0
public byte UserType
public string SelectUserType

1つを取得し、別のものを設定する必要があります。選択した値は、設定しようとしているものと同じにすることはできません。

@Html.DropDownListFor(p => p.SelectUserType, new SelectList(~~UserTypeNames, "Key", "Value",UserType))

リストにはEnum辞書を使用しています。そのため、「キー」と「値」のペアがあります。



0

これはCSSの問題です。Bootstrap 4の@ Html.DropDownListForが機能しない理由がわかりません。確かにこれはクラス設計の問題です。とにかく、回避策は、ドロップダウン入力ボックスにCSSパディングがある場合:#px、#px; 要素はそれを無効にします。これがうまくいくことを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.