Я пытаюсь заполнить раскрывающийся список в моем представлении, используя EditorFor, с шаблоном для выпадающего списка и UIHint на viewmodel.Преобразование запроса Linq в репозиторий в SelectListItem из типа ViewModel
Выпадающее меню определено в viewmodel как IEnumerable.
ViewModel
public partial class FilmEditViewModel
{
public int filmID { get; set; }
public IEnumerable<SelectListItem> filmName { get; set; }
public string releaseDate { get; set; }
}
Хранилище имеет метод GetSelect, который должен возвращать IEnumerable.
Repository
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»
Как преобразовать запрос в SelectListItem, которые могут быть переданы в ViewModel?
Дополнительная информация в случае, если это помогает ...
DropDown Шаблон
@model FilmStore.ViewModels.FilmEditViewModel
@Html.DropDownListFor(o => o.filmName, new SelectList(Model.filmName, "Text", "Value"))
Create.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 работает с несколькими настройками кода в другом месте.
Мне пришлось слегка изменить контроллер, и я очистил код в репозитории.Изменения ниже:
Repository
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);
}
спасибо, это работает. Я обновил вопрос с помощью нескольких изменений кода для сопоставления viewmodels с представлением. – melkisadek
Отлично, рад, что я мог бы помочь. – Mariusz