127

コントローラーでselectListを作成して、ビューに表示します。

私はその場でそれを作成しようとしています、ちょっとしたこと..このように...

myViewData.PageOptionsDropDown = 
   new SelectList(new [] {"10", "15", "25", "50", "100", "1000"}, "15");

コンパイルしますが、出力が悪いです...

<select id="PageOptionsDropDown" name="PageOptionsDropDown">
    <option>10</option>
    <option>15</option>
    <option>25</option>
    <option>50</option>
    <option>100</option>
    <option>1000</option>
</select>

アイテムが選択されていないことに注意してください。

どうすればこれを修正できますか?

4

23 に答える 23

127

これが私のやり方です

IList<Customer> customers = repository.GetAll<Customer>();
IEnumerable<SelectListItem> selectList = 
    from c in customers
    select new SelectListItem
    {
        Selected = (c.CustomerID == invoice.CustomerID),
        Text = c.Name,
        Value = c.CustomerID.ToString()
    };

一見すると、あなたが何を求めているのかわかりません...

于 2009-04-23T14:33:06.210 に答える
48

items, dataValueField, dataTextField, selectedValueパラメーターとして受け入れるコンストラクターの使用:

ViewData["myList"] = 
                new SelectList(new[] { "10", "15", "25", "50", "100", "1000" }
                .Select(x => new {value = x, text = x}), 
                "value", "text", "15");

それからあなたの見解では:

<%=Html.DropDownList("myList") %>
于 2009-04-23T14:35:34.923 に答える
19

Thomas Stock の回答から構築して、これらのオーバーロードされたToSelectListメソッドを作成しました。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;

public static partial class Helpers
{
    public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, Func<T, object> value, bool selectAll = false)
    {
        return enumerable.ToSelectList(value, value, selectAll);
    }

    public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, Func<T, object> value, object selectedValue)
    {
        return enumerable.ToSelectList(value, value, new List<object>() { selectedValue });
    }

    public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, Func<T, object> value, IEnumerable<object> selectedValues)
    {
        return enumerable.ToSelectList(value, value, selectedValues);
    }

    public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, Func<T, object> value, Func<T, object> text, bool selectAll = false)
    {
        foreach (var f in enumerable.Where(x => x != null))
        {
            yield return new SelectListItem()
            {
                Value = value(f).ToString(),
                Text = text(f).ToString(),
                Selected = selectAll
            };
        }
    }

    public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, Func<T, object> value, Func<T, object> text, object selectedValue)
    {
        return enumerable.ToSelectList(value, text, new List<object>() { selectedValue });
    }

    public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, Func<T, object> value, Func<T, object> text, IEnumerable<object> selectedValues)
    {
        var sel = selectedValues != null
            ? selectedValues.Where(x => x != null).ToList().ConvertAll<string>(x => x.ToString())
            : new List<string>();

        foreach (var f in enumerable.Where(x => x != null))
        {
            yield return new SelectListItem()
            {
                Value = value(f).ToString(),
                Text = text(f).ToString(),
                Selected = sel.Contains(value(f).ToString())
            };
        }
    }
}

コントローラーで、次の操作を行う場合があります。

var pageOptions = new[] { "10", "15", "25", "50", "100", "1000" };
ViewBag.PageOptions = pageOptions.ToSelectList(o => o, "15" /*selectedValue*/);

最後に、ビューに次のように入力します。

@Html.DropDownList("PageOptionsDropDown", ViewBag.PageOptions as IEnumerable<SelectListItem>, "(Select one)")

目的の出力が得られます。もちろん、"(Select one)"最初の空のアイテムが必要ない場合は、上記の optionLabel を省略できます。

<select id="PageOptionsDropDown" name="PageOptionsDropDown">
<option value="">(Select one)</option>
<option value="10">10</option>
<option selected="selected" value="15">15</option>
<option value="25">25</option>
<option value="50">50</option>
<option value="100">100</option>
<option value="1000">1000</option>
</select>

更新:改訂されたコード リストは、XML コメント付きでここにあります。

于 2011-03-04T02:33:09.843 に答える
11

これはオプションです:

myViewData.PageOptionsDropDown = new[] 
{
 new SelectListItem { Text = "10", Value = "10" },
 new SelectListItem { Text = "15", Value = "15", Selected = true }
 new SelectListItem { Text = "25", Value = "25" },
 new SelectListItem { Text = "50", Value = "50" },
 new SelectListItem { Text = "100", Value = "100" },
 new SelectListItem { Text = "1000", Value = "1000" },
}
于 2009-06-24T16:50:18.023 に答える
10

それが文字通りやりたいことのすべてである場合は、配列を文字列として宣言するだけで、選択された項目の問題が修正されます。

myViewData.PageOptionsDropDown = 
   new SelectList(new string[] {"10", "15", "25", "50", "100", "1000"}, "15");
于 2011-01-15T18:02:30.473 に答える
7

プロパティがInt、String、Double値などの単純なオブジェクトでなくても、SelectListとSelectedValueを連携させるのは非常に簡単です。

例:

Regionオブジェクトが次のようになっていると仮定します。

public class Region {
     public Guid ID { get; set; }
     public Guid Name { get; set; }
}

そして、ビューモデルは次のようなものです。

public class ContactViewModel {
     public DateTime Date { get; set; }
     public Region Region { get; set; }
     public List<Region> Regions { get; set; }
}

あなたは以下のコードを持つことができます:

@Html.DropDownListFor(x => x.Region, new SelectList(Model.Regions, "ID", "Name")) 

RegionオブジェクトのToStringメソッドを次のようにオーバーライドする場合のみ:

public class Region {
     public Guid ID { get; set; }
     public Guid Name { get; set; }

     public override string ToString()
     {
         return ID.ToString();
     }
}

これには100%の保証があります。

しかし、すべての状況でSelectListを100%機能させる最善の方法は、Equalsメソッドを使用して、アイテムコレクションの各アイテムに対してDropDownListまたはListBoxプロパティ値をテストすることです。

于 2012-07-28T23:08:30.703 に答える
4

私はまったく同じ問題を抱えていました。解決策は簡単です。DropDownListヘルパーに渡される「name」パラメーターを、ViewModelに存在するどのプロパティとも一致しないものに変更するだけです。詳細はこちら: http: //www.dotnetguy.co.uk/post/2009/06/25/net-mvc-selectlists-selected-value-does-not-get-set-in-the-view

ダンワトソンを引用します:

MVCでは、ビューが強く入力されている場合、選択リストの選択されたオプションがオーバーライドされ、コンストラクターで設定された選択されたオプションプロパティがビューに到達せず、代わりにドロップダウンの最初のオプションが選択されます(なぜまだ少し謎です) 。

乾杯!

于 2011-09-05T18:01:45.407 に答える
3

単純:

string[] someName = new string[] {"10", "15", "25", "50", "100", "1000"};
myViewData.PageOptionsDropDown = new SelectList(someName, "15");
于 2011-08-17T23:44:13.997 に答える
3

これらの答えはすべて素晴らしく見えますが、コントローラーがよく知られている構造化された形式でビューのデータを準備しているように見えます.モデルを介して配信された IEnumerable<> をビューに単純に反復させ、標準の選択リストを作成してから DefaultModelBinder を許可しますアクションパラメーターを介して、選択したアイテムをあなたに送り返します。はい、いいえ、なぜですか?関心の分離ですね。UI とビュー固有の何かを構築するためのコントローラーがあるのは奇妙に思えます。

于 2011-01-26T19:38:10.697 に答える
2

このように実行しただけで、問題はありませんでした。

public class myViewDataObj
    {
        public SelectList PageOptionsDropDown { get; set; }
    }

public ActionResult About()
        {
            myViewDataObj myViewData = new myViewDataObj();
            myViewData.PageOptionsDropDown =
                  new SelectList(new[] { "10", "15", "25", "50", "100", "1000" }, "15");

            ViewData["myList"] = myViewData.PageOptionsDropDown;
            return View();
        }

<%=Html.DropDownList("myList") %>

これを行うとうまくいきました、

public ActionResult About()
        {
            myViewDataObj myViewData = new myViewDataObj();
            myViewData.PageOptionsDropDown =
                  new SelectList(new[] { "10", "15", "25", "50", "100", "1000" });

            ViewData["myListValues"] = myViewData.PageOptionsDropDown;
            ViewData["myList"] = "15";
            return View();
        }

<%=Html.DropDownList("myList",(IEnumerable<SelectListItem>)ViewData["myListValues"]) %>
于 2009-07-21T13:21:42.540 に答える
1
MonthRepository monthRepository = new MonthRepository();
IQueryable<MonthEntity> entities = monthRepository.GetAllMonth();
List<MonthEntity> monthEntities = new List<MonthEntity>();

foreach(var r in entities)
{
    monthEntities.Add(r);
}

ViewData["Month"] = new SelectList(monthEntities, "MonthID", "Month", "Mars");
于 2010-03-16T12:35:10.923 に答える
1

私はこのようにします:

List<SelectListItem> list = new List<SelectListItem>{
new SelectListItem {Selected = true, Text = "Select", Value = "0"},
new SelectListItem {Selected = true, Text = "1", Value = "1"},
new SelectListItem {Selected = true, Text = "2", Value = "2"}
};
return list.ToArray();

ToArray() が問題を処理します。

于 2010-09-30T07:55:25.153 に答える
0

考えられる説明は、バインドしている選択リストの値が文字列ではないことです。

その例では、パラメーター 'PageOptionsDropDown' はモデル内の文字列ですか? そうでない場合、リストで選択された値が表示されないためです。

于 2010-12-13T03:58:00.413 に答える
0

mvc 1 がどのようにセットアップされたか思い出せませんが、それが属するフィールドと同じ名前の選択リストが必要だったようです...

私が見つけたのは、誰かが上で言ったように、送信された ViewData がフィールドと同じ名前であるときに、選択リストが mvc2 で機能していなかったことです。

例えば:

<%= Html.DropDownListFor((model => model.ForID), (SelectList)ViewData["ForName"]) %>

次の場合に機能します

<%= Html.DropDownListFor((model => model.ForID), (SelectList)ViewData["ForID"]) %>

ViewData 名「ForID」は、それが機能しているフィールドと同じ名前であるため、機能しません

于 2010-04-14T04:43:51.237 に答える
0

ViewData にあいまいさがある場合があります。

こちらをご覧ください

于 2009-04-23T14:42:05.953 に答える
0

Html.DropDownList 拡張メソッドで MVC 2 のソース コードを見ると、SelectList クラスの SelectedValue プロパティがチェックされません。モデルとの照合のみを試みます。

上記はすべてテーマのバリエーションです。つまり、ドロップダウンリストのビューに大量のデータを送信する方法と、それらはすべて互いに同等です(多かれ少なかれ)。

問題はビューにあります。設定した selectvalue を尊重する独自の DropDownList 拡張メソッドを作成するか、手動で繰り返します。どちらがあなたに最も適していますか。

于 2011-01-03T15:39:17.957 に答える
0

モデルにコレクションがあり、ビューが強く型付けされている場合、これのいくつかのバリエーションが機能します。

@Html.DropDownListFor(x => x.RegionID, 
    new SelectList(Model.Regions,"RegionID", "RegionName", Model.RegionID))

-また-

@Html.DropDownList("RegionID", 
    new SelectList(Model.Regions, "RegionID", "RegionName", Model.RegionID))
于 2011-09-30T17:17:16.147 に答える
0

デフォルト項目の代わりに、モデルで選択された値が利用されます。(すべての投稿を読んでいないことに同意します)

于 2010-03-28T16:33:43.037 に答える