10

従業員情報で構成されるモデルがあります。私のモデルには、Employee が住んでいる都市を定義する City というプロパティがあります。プロパティを以下に示します

    public string City{get;set;}

これで、従業員が登録するフォームを含むビューができました。ドロップダウン リストを使用して都市を選択したいと考えています。私が発見したように、以下のコードがドロップダウンに使用されると思います。私のモデル名は従業員です。

    @Html.DropDownListFor(m=>m.City,new SelectList())

「ドロップダウンリストのオプションを SelectList() メソッドで直接定義する方法はありますか?」と教えてください。

そうでない場合は、このドロップダウンのクラスをどこで定義する必要がありますか、どこで呼び出し、どこでレンダリングする必要がありますか? 値を定義する場所がわかりません。これは mvc であり、懸念を分離する必要があり、どこにも何も定義できないと思うので、私は非常に混乱していますか?

前もって感謝します..

4

2 に答える 2

13

少なくとも 2 つのオプションがあります。

1.) リスト、配列、またはその他のコレクション タイプの都市をモデルに追加します。

2.) モデルに SelectList プロパティを追加する

オプション 1 は、文字列の配列のような単純なものにすることも、たとえばオブジェクトIEnumerableの配列にすることもできCityます。次に、バインディングSelectListItemの一部として、このプロパティをビュー内のオブジェクトのコレクションに変換する必要があります。DropDownList

オプション 2 には、 に直接バインドできるという利点がDropDownListありますが、アクション メソッド内でリストを作成する必要があります。

その後、最終結果は同じです。それは、SoCについてどれだけ詳しく知りたいかという問題です。

例 ( というプロパティを追加すると仮定Cities):

@Html.DropDownListFor(m=>m.City, Model.Cities.Select(city => new SelectListItem()
{
    Text = city,
    Value = city,
    Selected = city == Model.City
})

編集:

あなたのコメントに答えるには、いくつかの仮定をしなければなりません。というモデルがあると仮定しますEmployeeModel。このモデルにCityは、プレーンな文字列である というプロパティがあります。したがって、これはモデルの一部です。次のようになります。

public class EmployeeModel
{
    public string City { get; set; }

    // ... other properties ...
}

したがって、ドロップダウンにバインドするためのプロパティを追加する必要がある場合は、次のいずれかを実行します。

public class EmployeeModel
{
    public string City { get; set; }

    public IEnumerable<string> Cities { get; set; }

    // ... other properties ...
}

また

public class EmployeeModel
{
    public string City { get; set; }

    public SelectList Cities { get; set; }

    // ... other properties ...
}

この新しいプロパティには、ユーザーが選択できる都市のリストが含まれます。

最初のオプションを選択した場合は、データストアから IEnumerable を読み込み、ビューで上記の最初の例を使用します。これは、LINQ を使用してCitiesプロパティ内の各文字列を新しいSelectListItemオブジェクトに射影します。

2 番目のオプションを使用する場合はSelectList、モデルをビューに渡す前にアクションで を作成します。IEnumerableクラスは(都市のリスト) と "選択された値" を取得するコンストラクターを提供するため、これはそれほど難しくありません( http://msdn.microsoft.com/en-us/Cityを参照) 。 library/dd460123%28v=vs.108%29.aspx )。コードは次のようになります。

model.Cities = new SelectList(GetCities(), model.City);

もちろん、これは、GetCities()都市が保存されている場所からロードするためのヘルパー メソッド ( ) があることを前提としています。あなたのビューは次のようになります。

@Html.DropDownListFor(m=>m.City, model.Cities)

次に、ビュー エンジンはこれらの を使用して要素とその要素SelectListItemを構築します。<select><option>

于 2013-03-04T05:49:01.590 に答える
2

モデルにこれを含めることができますが、それはすぐに達成されますが、お勧めしません:

public class Place
{
    public string City{get;set;}
    public SelectListItem[] Cities()
    {
        return new SelectListItem[2] { new SelectListItem() { Text = "London" }, new SelectListItem() { Text = "New York" } };
    }
}

...そしてあなたの見解

@Html.DropDownListFor(m => m.City, Model.Cities())

このようなものに最適な場所(ただし、もう少し複雑です)はあなた自身のhtmlhelperものであり、使用法は次のようになります。

@html.CityDropDownFor(m => m.City)

都市を適切にキャッシュすることで、データと UI の作業をモデルから除外できます。

独自のヘルパーを作成する方法について詳しく知りたい場合は、[read up] を少しお勧めします。1

于 2013-03-04T12:13:47.673 に答える