2

私の MVC アプリケーションでは、ドメイン名のリストを表示するドロップダウンを追加する必要があります。

複数のプロパティを含む ViewModel を既に持っています。ステップの順序がどうあるべきかわかりません:

  1. ViewModel私の?に新しいプロパティを追加します。タイプは何ですか?リスト?
  2. 上記のプロパティに値を設定するメソッドを定義します。
  3. ビューでそのプロパティを使用しますか? を使用しHTML.DropdownForますか?

質問にコードを入力する必要があることはわかっていますが、現在、これを開始するのに苦労しています...

編集: ViewModel に次のプロパティを追加しました:

 public IEnumerable<SelectListItem> DomainList { get; set; }

ドメインのリストを返すメソッドを実装しました。

internal static List<Domain> FetchAllDomains()

コントローラー アクションの次は、次のとおりです。

var domains = FetchAllDomains().Select(d => d.DomainName);
return new EmailModel() {DomainList = domains };

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

タイプ 'System.Collections.Generic.IEnumerable' を 'System.Collections.Generic.IEnumerable' に暗黙的に変換することはできません。明示的な変換が存在します (キャストがありませんか?)

4

6 に答える 6

9

1) ViewModel に新しいプロパティを追加しますか? タイプは何ですか?リスト?

より正確にするには、2 つのプロパティが必要ですIEnumerable<SelectListItem>。使用可能なすべてのオプションを保持するプロパティと、選択した値を保持するスカラー プロパティです。

2) 上記のプロパティに値を設定するメソッドを定義します。

はい。

3) ビューでそのプロパティを使用しますか? HTML.DropdownFor を使用しますか?

いいえ、ビューではありません。ビューはメソッドを呼び出しません。ビューはビュー モデルで動作します。適切に入力されたビュー モデルをビューに渡すのは、コントローラーの役割です。

たとえば、次のようになります。

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

    ... some other properties that your view might need
}

次に、このビュー モデルにデータを入力するコントローラー アクション:

public ActionResult Index()
{
    var model = new MyViewModel();
    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)

アップデート:

更新された質問によると、明らかに不可能なIEnumerable<SelectListItem>タイプの値を割り当てようとしているビューモデルにプロパティがあります。これを次のようIEnumerable<string>に変換できます。IEnumerable<SelectListItem>

var domains = FetchAllDomains().Select(d => new SelectListItem
{
    Value = d.DomainName,
    Text = d.DomainName
});
return new EmailModel { DomainList = domains };
于 2012-05-07T15:36:15.923 に答える
3

よろしければ、試験の例のリストをお見せします

public class SomeClass
{
    //Properties

    public int ExamId { get; set; }
    public SelectList ExamList { get; set; }
}

ヘルパー:

public static void PopulateExamList(MarkEditViewModel model,
    List<Exam> examList)
{
    model.ExamList = new SelectList(examList, "Id", "ExamName");
}

私の例では、すべての試験のリストにマークを追加する必要があります。この後、ビューで、検査とビューのドロップダウン リストを取得し
ます (モデル内のすべての要素に対して):

@Html.DropDownListFor(model => model.ExamId,
                                        Model.ExamList,
                                        "Choose exam")
于 2012-05-07T15:36:55.190 に答える
1

コントローラーにリストを取得したら、(モデルとして、または ViewBag を使用して) ビューに渡し、ヘルパーを使用します。

Html.DropDownList(
    string name,
    IEnumerable<SelectListItem> selectList,
    string optionLabel,
    object htmlAttributes) 

または (MVC 3)

@Html.DropDownListFor(model => model.Property.ID,
    new SelectList(model.PropertyList, "ID", "Type"))
于 2012-05-07T15:33:45.463 に答える
0

あなたは正しい方向に進んでいます。ViewModelに2つのプロパティがあります。1つはアイテムのリストを保持し、もう1つはUIから選択したアイテムIDを保持します

public class ProductViewModel
{
    public IEnumerable<SelectListItem> Items { get; set; }
    public string SelectedItemId { get; set; }
    //Other Properties
}

そして、Get Actionメソッドで、データを含むViewModelを返します

 public ActionResult Index()
 {
    var objProduct = new ProductViewModel();
    objProduct.Items = new[]
    {
          new SelectListItem { Value = "1", Text = "Domain 1" },
          new SelectListItem { Value = "3", Text = "Domain 2" },
          new SelectListItem { Value = "3", Text = "Domain 3" }
    };
    // can replace the above line with loading data from Data access layer.
    return View(objProduct);
}

そして、ProductViewModelに強く型付けされたビューで

@model ProductViewModel
@using (Html.BeginForm())
{ 
  @Html.DropDownListFor(x => x.SelectedItemId, new SelectList(Model.Items,"Value","Text"), "Select..")
  <input type="submit" value="save" />
}

HTTPpostアクションでは、選択した値を使用できます

[HttpPost]
public ActionResult Index(ProductViewModel model)
{
 //  check model.SElectedItemId here

}
于 2012-05-07T15:40:54.713 に答える