ビューモデルのプロパティを(アイテムDropDownList
を指定できるように)レンダリングする必要があると言う方法はありますか?DropDownList
多くのカスタム実装を見つけましたが、そのような基本的なものを実装する組み込みの方法があるはずです。
アップデート。モデルをメソッドでレンダリングしてHtml.EditorForModel
いますが、次のようなメソッドは使用したくありませんHtml.DropDownListFor
ビューモデルのプロパティを(アイテムDropDownList
を指定できるように)レンダリングする必要があると言う方法はありますか?DropDownList
多くのカスタム実装を見つけましたが、そのような基本的なものを実装する組み込みの方法があるはずです。
アップデート。モデルをメソッドでレンダリングしてHtml.EditorForModel
いますが、次のようなメソッドは使用したくありませんHtml.DropDownListFor
, ,ドロップダウンNullable<bool>
をレンダリングするタイプを除いて、ドロップダウン リストをレンダリングする組み込みのテンプレートはありませんが、それはあなたが求めているものではないと思います。Not Set
Yes
No
それでは、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>
}
}
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)