web-dev-qa-db-ja.com

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

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")

1は私が選択したいoptionのIDです、私はまたoptionのテキストで試してみました、しかしそれはまた働きません。

何か案は?

88
Ibrar Hussain

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

最初の

@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コードを書くためにあなたであれば私が使用するコードもあります

Viewmodel:

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")
163
Romias

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

コントローラ:

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');
});
19
VINICIUS SIN

このようなオブジェクトを渡すと:

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

あなたが言っているのは、Source(Model)とKey("Code")、Text("Name")と選択された値0です。おそらくCodeプロパティのソースに0値がないので、HTMLヘルパーは最初の要素を選択して実際のselectedValueをこのコントロールに渡します。

6
Felipe Oriani

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

//モデル

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" })
3

ビューに表示される内容がわかっている場合は、view/cshtmlファイルに設定する代わりに、Controllerからもデフォルト値を設定できます。 HTML側からデフォルト値を設定する必要はありません。

コントローラーファイル内。

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

.cshtmlファイル内。

@Html.DropDownListFor(row => row.TypeofCommission, new SelectList(Model.commissionTypeModelList, "type", "typeName"), "--Select--")
2
Smit Patel
public byte UserType
public string SelectUserType

入手して別のものを設定する必要があります。選択された値は、設定しようとしているものと同じ項目にすることはできません。

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

私は自分のリストにEnum辞書を使っています、それが "key"と "value"のペアがある理由です。

0
MEO

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

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
g.breeze

私はこれが質問への答えではないことを知っていますが、私はこの記事につまずいたときにその場でリストから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)唯一の項目であり、b)SelectListItem.Selectedプロパティで既にそれが述べられているからです。

ご参考までに、データソースはAJAXページです。このページには、SelectWoo/Select2コントロールを使用して動的にロードされます。

0
Damian Vogel

私は同じ問題を抱えていました、私は同じようにViewBagと要素名を使用していました。 (タイプミス)

0
Arun Prasad E S

コントローラーセクションを追加

  ViewBag.Orders= new SelectList(db.Orders, "Id", "business", paramid);

Htmlセクションを追加

   @Html.DropDownList("Orders", null)

簡単な方法

0
ibrahim ozboluk

私のための一般的な解決策:)

@{
     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
chmod

空のアイテム、選択されたアイテムを含むドロップダウンへのリンク(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 });
0
user4584103