3

バックエンド データに基づいて「選択済み」オプションを設定したいと思います。これが私のコードのサンプルです...

<select id="listName" name="listName">
    <option>Select Name</option>
        @foreach (var item in ViewBag.NameList as Dictionary<string, string>)
        {                
            //worked in MVC2, not with razor
            <option value= '@item.Key' @if (TempData["name"].ToString() == item.Key) { selected = "&quot;selected&quot;"); }>@item.Value - @item.Key</option> 

            string nameSelect = TempData["name"].ToString() == item.Key ? "selected" : "";
            <option value= '@item.Key' selected= '@nameSelect'>@item.Value - @item.Key</option>                           
        }
</select>

これを行うより良い方法はありますか?

4

2 に答える 2

5

これを行うより良い方法はありますか?

ああ、ええ。もちろん、ビューモデルを使用します。それでは、ビューモデルを定義しましょう:

public class MyViewModel
{
    public string SelectedValue { get; set; }
    public IEnumerable<SelectListItem> Values { get; set; }
}

次に、データ ソースからこのビュー モデルを生成するコントローラー アクション:

public ActionResult SomeAction()
{
    var model = new MyViewModel();

    // preselect an item with Value=2
    model.SelectedValue = "2"; 

    // this could of course come from a database or something
    model.Values = new[]
    {
        new SelectListItem { Value = "1", Text = "item 1" },
        new SelectListItem { Value = "2", Text = "item 2" },
        new SelectListItem { Value = "3", Text = "item 3" },
    };

    return View(model);
}

最後に、対応する厳密に型指定されたビュー:

@model MyViewModel
....


@Html.DropDownListFor(x => x.SelectedValue, Model.Values, "Select")

質問で辞書を示したので、この辞書をすでに持っていると推測できます。あなたの例では、ViewBag に詰め込みましたが (これは間違っています)、ビュー モデルにバインドできます。

public ActionResult SomeAction()
{
    Dictionary<string, string> values = ......

    var model = new MyViewModel();
    model.SelectedValue = (string)TempData["name"]; 
    model.Values = values.Select(x => new SelectListItem
    {
        Value = x.Key,
        Text = string.Format("{0} {1}", x.Key, x.Value)
    });

    return View(model);
}

それが ASP.NET MVC です。厳密な型指定、ビュー モデル、ViewBag はありません。

于 2012-07-30T15:32:29.833 に答える
2

を除いて@Html.DropDownListFor、次のようにコーディングできます。

<option value= '@item.Key' @(TempData["name"].ToString() == item.Key ? "selected" : "")>@item.Value - @item.Key</option> 

ところで、私は @Html.DropDownListFor が好きではありません..

于 2012-07-30T15:44:40.937 に答える