Выпадающий список MVC от другого лица - PullRequest
1 голос
/ 03 февраля 2011

У меня есть вид, который наследуется от System.Web.Mvc.ViewPage<P>.

Тип P имеет свойство типа C, т. Е. P может быть:

class P
{
   public string Name { get; set; }
   public C OtherData { get; set; }
}

Представление, о котором идет речь, предназначено для создания нового P, и поэтому я хочу создать список DropDown всех доступных C.

Таким образом, раскрывающийся список может быть:

  • С1
  • С2
  • С3

Я попытался создать List<SelectListItem> объект для C в моем контроллере, а затем передать их в представление с помощью ViewData, но это не работает, так как при попытке отправки я получаю исключение :

System.InvalidOperationException: There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key C.

Итак, мой вопрос, как мне создать список C объектов для отображения в моем представлении, который наследуется от типа P. Список объектов извлекается из базы данных, и поэтому я не могу просто жестко закодировать параметры в представлении.

Нужно ли создавать другой тип модели, который объединяет два типа вместе?

Ответы [ 2 ]

1 голос
/ 03 февраля 2011

Я делаю это следующим образом:

ViewModel:

public class ViewModel
{
    public string Name { get; set; }
    public List<SelectListItem> ListOfCs { get; set; }
}

Мой Вид имеет следующее:

<%:Html.EditorFor(model => model, new { ListOfCs = Model.ListOfCs })%>

Я использую Object.ascx по умолчанию, обрисованный в общих чертах в Отличная серия постов в блоге Брэда Уилсона по шаблонам ASP.NET MVC 2

Затем я добавляю раскрывающийся шаблон для этого раскрывающегося списка в папку Views / Shared / EditorTemplates и называю его что-то вроде CClassDropDown:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<string>" %>

<%: Html.DropDownList(null, new List<SelectListItem>(ViewData["ListOfCs"] as List<SelectListItem>), "Select C...")%>

А затем я добавляю частичный класс метаданных для объекта P:

[MetadataType(typeof(PMetaData))]
public partial class P
{
    public class PMetaData
    {
        [UIHint("CClassDropDown")] 
        [DataType(DataType.Text)]
        public object C { get; set; }

    }
}

к метаданным для этого свойства класса, чтобы он знал, использовать ли шаблон, который я указал.

0 голосов
/ 03 февраля 2011

Я сделал это только с Linq2Sql, так что YMMW.

В Linq2Sql у субъекта есть и иностранный объект, и ключ внешнего объекта.

Итак, он будет иметь C и C_id.

class P
{
public string Name { get; set; }
public C OtherData { get; set; }
public int OtherData_id { get; set; }
}

В этом случае это просто дело

MyViewData {
  SelectList CList = new SelectList( ctx.getCs(), "C_id", "C_name")
}  

и на странице делают

<%= Html.DropDownList("OtherData_id", Model.CList,"-") %>

Таким образом,

TryModelUpdate(...) 

правильно установит OtherData_id, что, в свою очередь, приведет к разрешению OtherData при доступе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...