web-dev-qa-db-ja.com

DropDownListFor-「選択された」値を選択しません

DropDownListFor "Selected"値を選択していないことに関するこれらの質問のもう1つ。コードは次のとおりです。

モデル:

public class CreateEditAccountModel
{
    [Required]
    [Display(Name = "Permission")]
    public int PermissionId { get; set; }
    public IEnumerable<SelectListItem> Permissions { get; set; }
}

コントローラー:

[HttpGet]
[Authorize]
public ActionResult EditAccount(int id)
{
    CreateEditAccountModel model = new CreateEditAccountModel();
    model.Permissions = PermissionsAll();
    return View("CreateEditAccount", model);
}

この時点で、戻り行にブレークポイントを設定すると、model.Permissionsには複数のアイテムとIEnumerable<SelectListItem>を持つ1つだけの適切なSelected = trueオブジェクトが含まれます。

表示:

@using (Html.BeginForm())
{
    @Html.DropDownListFor(m => m.PermissionId, Model.Permissions)
}

レンダリング:

<select id="PermissionId" name="PermissionId">
    <option value="">-- Select --</option>
    <option value="1">Permission one</option>
    <option value="2">Permission two</option>
</select>

何らかの理由で、どのオプションにも選択された属性がなく、最初のオプションが選択されています。

どんな助けでも大歓迎です。


[〜#〜]更新[〜#〜]

これと関係があるようです 記事 。この記事の解決策を要約すると、プロパティ名(@html.DropDownListの最初の引数)が既存のものと一致しないことを確認する必要がありますモデルのプロパティ。 なぜそうなのか誰か説明できますか?

ビューに次のように書き込むと、ドロップダウンが正しくレンダリングされます。

@Html.DropDownList("PermissionIdNotMatching", Model.Permissions)

ただし、実際にはバインダーがselect要素の名前をモデルプロパティに一致させることができるようにしたいので、これを行うことは論理的に意味がありません。それ以外の場合は、次のように手動で値を取得する必要があります:Request.Form["PermissionIdNotMatching"];

誰か考えがありますか?


[〜#〜]ソリューション[〜#〜]

受け入れられた回答とそれに対する最初のコメントを参照してください。

14
Dmitry Efimenko

さて、PermissionIdがintだったときの、あなたの例について話し合いましょう。タイプCreateEditAccountModelのモデルを投稿して表示しました。このモデルを作成したとき、PermissionIdは0(intのデフォルト値)に等しい。そして、ビュー内のDropDownListForはこの値を取得します。したがって、選択した値はありません。文字列型を使用した場合、PermissionIdのデフォルト値はnullであったため、 `DropDownListForはSelectListのデフォルト値を取得しました。

この場合、PermissionIdにはint?またはNullable<int>タイプを使用することをお勧めします。

8

@Html.DropDownListFor(m => m.PermissionId, Model.Permissions)を使用するときは、PermissionIdがモデルにすでに設定されていることを確認してください-選択されたアイテム/ idです。さらに、モデルには 'selected'属性が含まれています。

var query = DatabaseContexts.Select(
            c => new SelectListItem
            {
                Value = c.Key,
                Text = c.Value,
                Selected = c.Key == currentUsed
            });

 PermissionId = that want to select;
 Permissions = query.AsEnumerable();

更新:

httpGetの完全なサンプルは次のとおりです。

HomeController.csの場合:

[HttpGet]
public ActionResult EditAccount(int id)
{
    CreateEditAccountModel model = new CreateEditAccountModel();

    var permissionsAll = new List<SelectListItem>
         {
             new SelectListItem
                 {
                     Value = "",
                     Text = "--please select--",
                     Selected = false
                 },
             new SelectListItem
                 {
                     Value = "1",
                     Text = "Permission one",
                     Selected = true
                 },
             new SelectListItem
                 {
                     Value = "2",
                     Text = "Permission two",
                     Selected = false
                 }
         };
    model.PermissionId = 1; //add this line
    model.Permissions = permissionsAll; // PermissionsAll();// -- get data from services or anywhere....
    return View("EditAccount", model);
}

CreateEditAccountModel.cs:

public class CreateEditAccountModel
{
    [Required]
    [Display(Name = "Permission")]
    public int PermissionId { get; set; }
    public IEnumerable<SelectListItem> Permissions { get; set; }

}

EditAccount.cshtml:

@using MvcApplication1.Models
@model CreateEditAccountModel
@{
   ViewBag.Title = "EditAccount";
 }

<h2>EditAccount</h2>
@using (Html.BeginForm())
{
   @Html.DropDownListFor(m => m.PermissionId, Model.Permissions)
}

アプリケーションを実行して/ home/editaccount/1に移動すると、ドロップダウンはデフォルトで「パーミッション1」を選択します。

PermissionIdは「string」タイプである必要があると思います。System.Web.Mvc.SelectedListItem.Valueは「string」です。

ユーザーがドロップダウンリストでアイテムを選択したときに何かをしたい場合は、[HttpPost]が必要になる場合があります。

ところで: このリンク あなたに役立ちますか?

4
xoyoja