2013-09-24 2 views
0

Я пытаюсь заполнить раскрывающийся список в моем представлении, используя 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); 
} 

ответ

1

Ваш выпадающий шаблон ожидает модель типа FilmStore.ViewModels.FilmEditViewModel но вы передаете коллекцию фильмов. Если вы хотите сделать editortemplate для него, сделайте еще одну модель представления с Id выбранного значения и коллекцией фильмов.

Например

public class DropDownVM 
{ 
    public int PickedId {get; set;} 
    public IEnumerable<SelectListItem> Items {get;set;} 
} 

public class FilmEditViewModel 
{ 
    public string releaseDate { get; set; } 
    public DropDownVM films {get;set;} 
} 

//Template view 
@model DropDownVM 

@Html.DropDownListFor(m => m.PickedId, new SelectList(Model.Items , "Text", "Value")) 

//View 
@model FilmEditViewModel 

//...form etc. 
@Html.EditorFor(m =>m.films) 
+0

спасибо, это работает. Я обновил вопрос с помощью нескольких изменений кода для сопоставления viewmodels с представлением. – melkisadek

+0

Отлично, рад, что я мог бы помочь. – Mariusz

0

вы заполняете список, как вы должны, но вы упускаете заполнитель для выбранного значения из выпадающего списка, скажем, например, ChosenFilmId.

@Html.DropDownListFor(o => o.ChosenFilmId, Model.filmName) 

В посте действия, вы найдете выбранное значение, содержащееся в поле ChosenFilmId

+0

это все еще показывает ту же ошибку преобразования – melkisadek

Смежные вопросы