DropDownListFor и отношение моей лямбды к моей ViewModel - PullRequest
3 голосов
/ 23 мая 2010

После поиска в Google некоторое время я все еще рисую пробел здесь. Я пытаюсь использовать ViewModel, чтобы вытащить словарь для выпадающего списка в строго типизированном представлении:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="EveNotebook.ViewModels.CorporationJoinViewModel" %>

...

<%: Html.DropDownListFor(c => c.CorpDictionary.Keys, new SelectList(Model.CorpDictionary, "Value", "Key"))%>

Я получаю ошибку:

CS1061: «объект» не содержит определения для «CorpDictionary», и не найдено никакого метода расширения «CorpDictionary», принимающего первый аргумент типа «объект»

и соответствующий бит моей ViewModel

   public class CorporationJoinViewModel
    {
        DB _eveNotebook = new eveNotebookDB(); // data context

        public Dictionary<int, string> CorpDictionary
        {
            get
            {
                Dictionary<int, string> corporations = new Dictionary<int, string>();

                int x = 0;
                foreach (Corporation corp in _db.Corporations)
                {
                    corporations.Add(x, corp.name);
                }

                return corporations;
            }
        }

Признаюсь, у меня довольно волшебное понимание того, как linq находит мой объект ViewModel из этой лямбды, и сообщение об ошибке заставляет меня думать, что это не так. Является ли моя проблема методом, который я использую для передачи данных? Что мне здесь не хватает?


Решение

(Очень похоже на отличный ответ, но пробежал по компилятору и исправил несколько опечаток в процессе):

Контроллер

  var model = new CorporationJoinViewModel
                {
                    Corps = _eveNotebook.Corporations.Select( c => new SelectListItem
                                     {
                                          Text = c.name,
                                          Value = c.id.ToString()
                                     })
                };

    return View(model);

View

Inherits="System.Web.Mvc.ViewPage<IEnumerable<EveNotebookLibrary.Models.Corporation>>" %>

...

<%: Html.DropDownListFor(c => c.Corps, new SelectList(Model.Corps))%>

ViewModel

public class CorporationJoinViewModel : ViewPage
{
    public int CorporationId { get; set; }

    public IEnumerable<SelectListItem> Corps { get; set; }
}

1 Ответ

3 голосов
/ 23 мая 2010

Во-первых, вы не используете ссылку, вы просто используете лямбда-выражение для указания свойства модели. Во-вторых, ваше представление должно наследоваться от ViewPage, в данном случае строго типизированной страницы представления, специфичной для вашей модели. В-третьих, я хотел бы предложить, чтобы у вас было свойство для CorporationId (чтобы отправлять обратно от значения выбора) и IEnumerable<SelectListItem> для предоставления значений для раскрывающегося списка, вместо использования магических строк для создания SelectList. Для выбора можно использовать LINQ или методы расширения.

Обычно, я не хотел бы, чтобы модель представления была чем-то иным, чем контейнером - она ​​должна быть независимой от базы данных. Заполните модель представления в вашем контроллере из БД.

<%@ Page Title="" Language="C#"
    MasterPageFile="~/Views/Shared/Site.Master"
    Inherits="System.Web.Mvc.ViewPage<EveNotebook.ViewModels.CorporationJoinViewModel>"
 %>

<%: Html.DropDownListFor(c => c.CorporationId, Model.CorpDictionary )%>

Код модели

public class CorporationJoinViewModel
{
    public int CorporationId { get; set; }

    public IEnumerable<SelectListItem> CorpDictionary { get; set; }
}

Код контроллера

...
var model = new CorporationJoinViewModel
            {
                CorpDictionary = _eveNotebook.Corporations.Select( c => new SelectListItem
                                 {
                                      Text = c.name,
                                      value = c.id.ToString()
                                 }
            };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...