我正在尝试使用 EditorFor 在视图中填充下拉列表,并使用视图模型上的下拉模板和 UIHint。
下拉列表在视图模型中定义为 IEnumerable。
视图模型
public partial class FilmEditViewModel
{
public int filmID { get; set; }
public IEnumerable<SelectListItem> filmName { get; set; }
public string releaseDate { get; set; }
}
存储库具有应返回 IEnumerable 的 GetSelect 方法。
存储库
public IEnumerable<SelectListItem> GetSelect()
{
IEnumerable<SelectListItem> films = (from f in objContext.tFilm
orderby f.filmName
select new SelectListItem
{
Text = f.filmName,
Value = SqlFunctions.StringConvert((double?)f.filmID)
});
return films;
}
然后控制器创建一个新的 ViewModel 实例并从 GetSelect 填充列表。
控制器
public ActionResult Create()
{
var model = new FilmEditViewModel
{
filmName = _repo.GetSelect()
};
return View(model);
//IEnumerable<SelectListItem> films = _repo.GetSelect();
//var model = new FilmEditViewModel
//{
// filmName = films.Select(f => new SelectListItem
// {
// Value = f.Value,
// Text = f.Text
// })
//};
}
顶部的代码是我期望的。下面的注释代码是我试图更明确的地方。
两者都不起作用。
它们返回以下形式的错误:
传入字典的模型项的类型为“System.Data.Entity.Infrastructure.DbQuery`1[System.Web.Mvc.SelectListItem]”,但此字典需要“FilmStore.ViewModels.FilmEditViewModel”类型的模型项
如何将查询转换为可以传递给 ViewModel 的 SelectListItem?
其他信息以防万一...
下拉模板
@model FilmStore.ViewModels.FilmEditViewModel
@Html.DropDownListFor(o => o.filmName, new SelectList(Model.filmName, "Text", "Value"))
创建.cshtml
@using BootstrapSupport
@model Object
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
<fieldset class="form-horizontal">
<legend>@Model.GetLabel() <small>Details</small></legend>
@foreach (var property in Model.VisibleProperties())
{
using(Html.ControlGroupFor(property.Name)){
//changed first argument for label to show Validation.cs properties
@Html.Label(property.GetLabel(), new { @class = "control-label" })
<div class="controls">
@Html.Editor(property.Name, new { @class = "input-xlarge" })
@Html.ValidationMessage(property.Name, null, new { @class = "help-inline" })
</div>
}
}
<div class="form-actions">
<button type="submit" class="btn btn-primary">Save changes</button>
@Html.ActionLink("Cancel", "Index", null, new { @class = "btn " })
</div>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
@section scripts {
<script type="text/javascript">
$("[id$='Date']").datepicker(
{format: "dd/mm/yyyy" }
);
</script>
}
-------编辑答案-------- Mariusz的以下解决方案对其他地方的代码进行了一些调整。
我不得不稍微修改一下控制器,并清理了存储库中的代码。以下更改:
存储库
public IEnumerable<SelectListItem> GetSelect()
{
return from f in objContext.tFilm
orderby f.filmName
select new SelectListItem
{
Text = f.filmName,
Value = SqlFunctions.StringConvert((double?)f.filmID)
};
}
控制器
public ActionResult Create()
{
var model = new FilmEditViewModel();
FilmDropDownViewModel films = new FilmDropDownViewModel
{
Items = _repo.GetSelect(),
};
model.filmName = films;
return View(model);
}