8

ビューモデルのプロパティを(アイテムDropDownListを指定できるように)レンダリングする必要があると言う方法はありますか?DropDownList

多くのカスタム実装を見つけましたが、そのような基本的なものを実装する組み込みの方法があるはずです。

アップデート。モデルをメソッドでレンダリングしてHtml.EditorForModelいますが、次のようなメソッドは使用したくありませんHtml.DropDownListFor

4

2 に答える 2

14

, ,ドロップダウンNullable<bool>をレンダリングするタイプを除いて、ドロップダウン リストをレンダリングする組み込みのテンプレートはありませんが、それはあなたが求めているものではないと思います。Not SetYesNo

それでは、1 つ作成してみましょう。いつものように、2 つのプロパティ (選択した値用と使用可能な値用) を含むドロップダウンを表すビュー モデルを定義することから始めます。

public class ItemViewModel
{
    public string SelectedId { get; set; }
    public IEnumerable<SelectListItem> Items { get; set; }
}

次に、このプロパティを持つ標準のビュー モデルを作成できます。

public class MyViewModel
{
    public ItemViewModel Item { get; set; }
}

次に、ビューモデルを満たすコントローラー:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new MyViewModel
        {
            Item = new ItemViewModel
            {
                SelectedId = "2",
                Items = 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);
    }
}

および対応するビュー ( ~/Views/Home/Index.cshtml):

@model MyViewModel
@using (Html.BeginForm())
{
    @Html.EditorForModel()
}

あとは、DropDownViewModelタイプ ( ~/Views/Shared/EditorTemplates/DropDownViewModel.cshtml) のカスタム エディター テンプレートを定義するだけです。

@model DropDownViewModel
@Html.DropDownListFor(
    x => x.SelectedId, 
    new SelectList(Model.Items, "Value", "Text", Model.SelectedId)
)

Brad Wilson が で説明しているように、 Deep Diveを許可するために、Object タイプのデフォルト テンプレートをオーバーライドしますhis blog post。そうしないと、デフォルトで ASP.NET MVC はテンプレートの複雑なサブタイプに再帰しません。したがって、オーバーライドします~/Views/Shared/EditorTemplates/Object.cshtml:

@foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => pm.ShowForEdit && !ViewData.TemplateInfo.Visited(pm))) 
{
    if (prop.HideSurroundingHtml) 
    {
        @Html.Editor(prop.PropertyName)
    } 
    else 
    { 
        <div class="editor-label">
            @(prop.IsRequired ? "*" : "")
            @Html.Label(prop.PropertyName)
        </div>
        <div class="editor-field">
            @Html.Editor(prop.PropertyName)
            @Html.ValidationMessage(prop.PropertyName, "*")
        </div>
    }
}
于 2012-07-16T06:25:07.403 に答える
1

Html Helper DropDownList を使用してドロップダウン リストを作成できますが、モデル オブジェクトは SelectionListItem を数えることができる必要があります。

//on controller
    List<SelectListItem> items = new List<SelectListItem>();
     items.Add(new SelectListItem { Text = "Action", Value = "0"});
     items.Add(new SelectListItem { Text = "Drama", Value = "1" });
     items.Add(new SelectListItem { Text = "Comedy", Value = "2", Selected = true });
     items.Add(new SelectListItem { Text = "Science Fiction", Value = "3" });
     ViewBag.MovieType = items;

//on view

         @Html.DropDownList("MovieType")

モデル オブジェクトを SelectListItem として構築したくない場合は、DropDownListFor を使用する必要があります。

//you can use DropDownListFor as
 @Html.DropDownListFor(m=>m.Text,m.Value)
于 2012-07-16T05:05:37.660 に答える