web-dev-qa-db-ja.com

HTML.EditorForをドロップダウンに変換する(html.dropdownfor?)

現在、このようなデフォルトの「作成」ビューページでHtml.EditorForコントロールを使用しています。

 <%: Html.EditorFor(model => model.IsActive) %> 

これを値付きのドロップダウンに変換し、ビュー内のモデルにバインドしたいと思います。私の質問は2つあります。

  1. ドロップダウンに必要な値が2/3しかない場合、2つまたは3つの値を明示的に入力する簡単な方法はありますか?

  2. リストが大きく、SQLクエリから取得する必要がある場合、これを行うにはどうすればよいですか?

助けてくれてありがとう。

15
ZVenue

ドロップダウンリストを生成するには、ビューモデルに2つのプロパティが必要です。選択した値をバインドするスカラープロパティと、ドロップダウンに表示するアイテムを含むコレクションプロパティです。

したがって、ビューモデルを定義できます。

public class DropDownListViewModel
{
    public string SelectedValue { get; set; }
    public IEnumerable<SelectListItem> Items { get; set; }
}

次に、メインビューモデルに次のタイプのプロパティがあります。

public DropDownListViewModel Foo { get; set; }

これで、このタイプのカスタムエディタテンプレートを作成できます(~/Views/Shared/EditorTemplates/DropDownListViewModel.ascx):

<%@ Control 
    Language="C#" Inherits="System.Web.Mvc.ViewUserControl<DropDownListViewModel>" 
%>
<%= Html.DropDownListFor(x => x.SelectedValue, Model.Items) %>

次に、メインビューで:

<%= Html.EditorFor(x => x.Foo) %> 

あとは、コントローラーアクションでメインビューをレンダリングして、Fooプロパティに対応する値を入力するだけです。はハードコーディングされているか、リポジトリから取得されている可能性があります。それは本当に重要ではありません。

一方、値を事前に知っている場合は、エディターテンプレート(~/Views/Shared/EditorTemplates/YesNoDropDown.ascx):

<%= Html.DropDownList(
    "", 
    new SelectList(
        new[] 
        { 
            new { Value = "true", Text = "Yes" },
            new { Value = "false", Text = "No" },
        }, 
        "Value", 
        "Text",
        Model
    )
) %>

その後:

<%= Html.EditorFor(x => x.IsActive, "YesNoDropDown") %> 

または、ビューモデルのIsActiveプロパティを装飾することによって:

[UIHint("YesNoDropDown")]
public bool IsActive { get; set; }

その後:

<%= Html.EditorFor(x => x.IsActive) %> 
33
Darin Dimitrov