1. ホーム
  2. asp.net-mvc

[解決済み] Html.DropdownListForの選択値が設定されない件

2022-10-10 01:30:26

質問

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>

しかし、なぜかUnited Kingdomが選択されたままなのですが、"Please select a country"を選択させたいのですが、どうすればよいでしょうか?

どなたか、これを実現する方法をご存知でしょうか?

EDIT

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

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

1 のIdです。 option の ID であり、選択されるようにするために option のテキストでも試してみましたが、これもうまくいきません。

何かいい案はありませんか?

どのように解決するのですか?

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

まず ,

@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に入れる)。 を置いたプロパティと同じ名前である場合、quot;little bug" (または予期しない動作)があります。 を置いたプロパティと同じ名前である場合に発生します。これを避けるには、項目のリストを保持するプロパティを命名するときに別の名前を使用するだけです。

この問題を回避し、より良い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);
}

Viewで。

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