После поиска в 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; }
}