0

У меня возникла проблема с отображением данных в выпадающем меню на нескольких страницах. Сценарий: у меня есть 5 страниц с одинаковым частичным видом на всех этих страницах. В этом частичном представлении есть два выпадающего списка. Теперь есть два контроллера, один из которых - Домашний контроллер, а другой - Post Controller. Индексный метод действия Главной диспетчерской является:как отправить элемент списка в раскрывающийся список в частичном представлении на нескольких страницах

public ActionResult Index() 
{ 
    List<City> allCity = new List<city>(); 
    using (ApplicationDbContext dc = new ApplicationDbContext()) 
    { 
     allCity = dc.Cities.OrderBy(a => a.CityName).ToList(); 
    } 
    ViewBag.CityId = new SelectList(allCity, "Id", "CityName"); 
    return View(); 
} 

Теперь, в частичном, я отправки данных выпадающим как это:

@model App.Models.City 

<div class="dropdown"> 
@Html.DropDownList("Id", ViewBag.CityId as SelectList, new { @class = "short_dropdown" }) 

и рендеринг этого частичного вида на все страницы, как это:

<section class="container"> 
    @Html.Partial("_CommentBox") 

Теперь, если я вижу страницу index.cshtml Home Controller, тогда значения в раскрывающемся списке правильно заполняются. Но, если я перейти на главную страницу Post контроллера, то ошибка: **

Там нет ViewData элемент типа «IEnumerable», который имеет ключ «Id». System.InvalidOperationException: Нет элемента ViewData типа «IEnumerable» с ключом «Id».

Как решить эту проблему. Должен ли я отправлять данные вместе с частичным представлением. Если да, то у меня есть два раскрывающихся списка в одном частичном представлении, а затем как отправить данные для этих двух выпадающих списков.

+0

показать нам код Индекс контроллера метод –

+0

сообщение означает, что значение '' ViewBag.CityId' является null' –

ответ

2

В сообщении контроллера сделать то же самое, как вы делали в вашем домашнем контроллере для того, чтобы заполнить ViewBag.CityId. И, чтобы избежать дублирования кода вы можете переместить его в отдельный метод, который может быть использован повторно:

public static List<City> GetCities() 
{ 
    using (ApplicationDbContext dc = new ApplicationDbContext()) 
    { 
     return dc.Cities.OrderBy(a => a.CityName).ToList(); 
    } 
} 

, а затем заполнить ViewBag.CityId в как контроллеры:

ViewBag.CityId = new SelectList(SomeDomain.GetCities(), "Id", "CityName"); 
+0

много много Thnks для ответа на sir.It будет работать, но мне придется написать тот же код в 10 controller.Is есть ли способ, чтобы отправить два viewbag в тот же @ html.Partial() затем повторно его использовать. Должен ли я создать новый метод действий, который возвращает частичное представление и отправит несколько сумм представления в оператор return. Я думаю, что есть способ, но не знаю, как @Darin Dimitrov – duke

+0

Вы можете написать ['custom action filter'] (http://www.asp.net/mvc/overview/older-versions/hands-on-labs/ aspnet-mvc-4-custom-action-filters), которые добавят это значение в сумку просмотра, а затем украсят его действия с контроллером. Таким образом, вам не нужно явно помещать этот код в каждое действие контроллера. В качестве альтернативы вы можете написать пользовательский HTML-помощник, который будет генерировать те избранные в ваших представлениях. –

+0

Похоже, он получит более сложным я никогда не пробовал этот ОКК я постараюсь но сейчас, я не имею ни малейшего представления, как писать – duke

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