1

MVC3 でドロップダウン リストを作成する際に少し問題があります。これについて助けてくれる人がいることを願っています。

都市の DropDownList を含むユーザーのビューをレンダリングしようとしています。これは、データベースから取得する必要があります。実際、User クラスには City クラスの ForeignKey があります。

コントローラーとビューは次のとおりです。

public ViewResult Index()
{
    //return View(model);
    var DefaultCities = new[]
    {
        new {Name = "London"}
    }.ToList();

    IEnumerable<SelectListItem> cities = unitOfWork.CityRepository.Get() as IEnumerable<SelectListItem>;
    ViewData["AllCities"] = cities != null ? new SelectList(cities.AsEnumerable(), "CityID", "Name") : new SelectList(DefaultCities.AsEnumerable(), "Name");

    return View(unitOfWork.UserRepository.Get(orderBy: us => us.OrderByDescending(u => u.ID)).OfType<User>().ToList());
}

//景色

<div class="editor-field">
    @Html.DropDownList(**"CityID"**, ViewData["AllCities"] as SelectList, "--Choose One--"))
    @Html.ValidationMessageFor(model => model.CityID)
</div>

ただし、次のエラーが表示されます。

キー「CityID」を持つ「IEnumerable」タイプの ViewData アイテムはありません。

MVCは初めてです!「CityID」は何を参照していますか? の第一引数には何を書けばいい@Html.DropDownListですか?

さまざまな記事を読んだことがありますが、言及されている引数はフォーム フィールドの名前である必要があります。

誰でもサンプルコードを提案できますか? どんな助けでも大歓迎です。

4

3 に答える 3

5

次のコード行は間違っています。

new SelectList(cities.AsEnumerable(), "CityID", "Name")

CityIDおよびNameプロパティを指定していますがcitiesIEnumerable<SelectListItem>です。そしてプロパティSelectListItemのみを持っValueています。TextとのようなものはありませCityIDName

つまり、おそらく次のことを意味していました。

ViewData["AllCities"] = cities != null 
    ? new SelectList(cities, "Value", "Text") 
    : new SelectList(DefaultCities, "Name");

または単に:

ViewData["AllCities"] = cities != null 
    ? cities 
    : new SelectList(DefaultCities, "Name");

そしてあなたの見解では:

@Html.DropDownList( 
    "CityID", 
    ViewData["AllCities"] as IEnumerable<SelectListItem>, 
    "--Choose One--"
)

ビューのCityID引数に関する限り、これは基本的に DropDownList ヘルパーによって使用され、nameDOM の select 要素のプロパティが生成され、その結果、選択された値の名前がコントローラー アクションに渡されます。にフォームを送信しています。

ところで、ViewData/ViewBag を使用することは非常に悪い習慣です。代わりにビュー モデルを使用し、ビュー モデルの特定のプロパティに関連付けられる厳密に型指定された DropDownListFor ヘルパーをビューに含めることをお勧めします。

于 2013-05-31T20:14:37.703 に答える
1

コードを見ると、都市が null の場合、デフォルトの都市に移動します。ただし、デフォルトの SelectList には、CityID ではなく Name のみがリストされています。

最初にデフォルトのコレクションをバインドして、それが機能することを確認することもできます。次に、他の方法を試してください...それを絞り込むためのデバッグのヒントです。

必要なものは次のとおりです。

var cities = unitOfWork.CityRepository.Get();

    ViewData["AllCities"] = cities != null ? new SelectList(cities, "CityID", "Name") : new SelectList(DefaultCities.AsEnumerable(), "CityID", "Name");

そして、次のように表示されます。

@Html.DropDownList("Cities",(SelectList)ViewData["AllCities"])

また、DefaultCities を定義している場所を見ました。CityID もありません。 これ:

var DefaultCities = new[]
    {
        new {Name = "London"}
    }.ToList();

これでなければなりません:

var DefaultCities = new[]
    {
        new {Name = "London", CityID=1}
    }.ToList();
于 2013-05-31T20:17:46.013 に答える
1

都市リポジトリの出力がどのようにキャストされるのか興味がありますが、IEnumerable<SelectListItem> それが都市オブジェクトの列挙であると仮定すると、次のことを試すことができます

コントローラーで

ViewBag.Cities = new SelectList(unitOfWork.CityRepository.Get(), "CityID", "Name");

あなたの見解では

<div class="editor-field">
        @Html.DropDownList("CityID", (SelectList)ViewBag.Cities)
</div>
于 2013-05-31T20:15:53.743 に答える