5

これは、ASP.NETMVCビューのドロップダウンリストに入力するためのものです。

<%= Html.DropDownListFor(model => model.Bikes,
      Model.Bikes.Select(
      x => new SelectListItem {
               Text = x.Name,
               Value = Url.Action("Details", "Bike", new { bikeId = x.ID }),
               Selected = x.ID == Model.ID,
           })) %>

これをデバッグすると、Selectedプロパティがtrue必要なときに設定されていることがわかります。ただし、ビューがレンダリングされると、リスト内のどのオプションも選択されません。これは別のオーバーロードで実行できることを認識していますがDropDownListFor、このバージョンを機能させたいと思っています。

何か案は?

4

2 に答える 2

5

選択した値が機能しない理由は、オプション値としてUrlを使用しているがModel.IDSelected句で指定しているためです。

このようにしてみてください:

<%= Html.DropDownListFor(
    model => model.Bikes,
    new SelectList(Model.Bikes, "Id", "Name", Model.ID)
)%>

"Id"オプション値として使用される"Name"プロパティを示し、オプションラベルとして使用されるプロパティを示します。

保存したい場合は、次のUrl.Actionことを試すことができます。

<%= Html.DropDownListFor(
    model => model.Bikes,
    new SelectList(Model.Bikes.Select(x => new {
        Id = x.Id,
        Name = Url.Action("Details", "Bike", new { bikeId = x.ID })
    }), "Id", "Name", Model.ID)
)%>

モデルIDをオプション値として使用する方が論理的であると思われるため、名前とIDを逆にしたことに気付くでしょう。


アップデート:

これが機能しない理由は、 (ヘルパーIEnumerableの最初の引数)にバインドしているためです。同じコレクションDropDownListForを使用している間は、スカラープロパティである必要があります。model.Bikes

<%= Html.DropDownListFor(
    model => model.SelectedBikeValue,
    Model.Bikes.Select(
        x => new SelectListItem {
                 Text = x.Name,
                 Value = Url.Action("Details", "Bike", new { bikeId = x.ID }),
                 Selected = x.ID == Model.ID,
        }
)) %>

オプション値としてURLを使用しないことについての私の意見は真実です。

于 2010-07-28T11:33:53.640 に答える
0

私はこのコンセプトで非常に多くの問題を抱えてきました。特に、オブジェクトにそのプロパティを含むモデルから「name」プロパティを渡すことができない場合に現れます。これは、そのようなオブジェクト名が名前の前に自動的に追加されるためです。狂ってる。これを理解しようとして何時間も無駄にした後、私はあきらめて、ここで公開する独自のドロップダウン拡張機能を作成しました。とてもシンプルで問題なく動作します。

    public static MvcHtmlString SimpleDropDown(this HtmlHelper helper, object attributes, IEnumerable<SelectListItem> items, bool disabled = false)
    {
        XElement e = new XElement("select",
            items.Select(a => {
                XElement option = new XElement("option", a.Text);
                option.SetAttributeValue("value", a.Value);
                if (a.Selected)
                    option.SetAttributeValue("selected", "selected");
                return option;
            })
            );

        if (attributes != null)
        {
            Dictionary<string, string> values = (from x in attributes.GetType().GetProperties() select x).ToDictionary(x => x.Name, x => (x.GetGetMethod().Invoke(attributes, null) == null ? "" : x.GetGetMethod().Invoke(attributes, null).ToString()));
            foreach(var v in values)
                e.SetAttributeValue(v.Key, v.Value);
        }

        if (disabled)
            e.SetAttributeValue("disabled", "");

        return new MvcHtmlString(e.ToString());
    }

また、フラグを無効にすることを追加のパラメーターとして設定しました。これは、属性の標準の匿名リストを介してフラグにバインドする場合、非常に面倒になる可能性があるためです。

以下は、私が現在どのように使用しているかの例です。辞書をSelectListItemのリストに変換しますが、単純なリストにすることもできます。

@Html.SimpleDropDown(new { id="EOM", name = "EOM", @class = "topBox" }, Model.EOM.Select(x => new SelectListItem { Text = x.Value, Value = x.Key.ToString(), Selected = Model.EOM.Selected == x.Key }), !Model.EOM.Available)
于 2013-09-20T12:05:18.830 に答える