2009-05-19 6 views
2

Все мои контроллеры в моем проекте наследуются от базового контроллера, который имеет свойство с моей моделью Entity.ASP.NET MVC: Помогает ли помощник захватить данные?

Позвольте сказать, что у меня есть представление, показывающее города в мире, и у него есть возможность фильтровать по странам. Фильтр страны - это выпадающий список стран из базы данных. Помощник Html для раскрывающегося списка запрашивает IEnumerable<SelectItem>.

Теперь с этой информацией, это нормально, если я создаю HtmlHelper, который выглядит следующим образом:

public static IEnumerable<SelectListItem> GetCountries(HtmlHelper htmlHelper) 
    { 
     return (from c in ((BaseController) htmlHelper.ViewContext.Controller).Entities.Countries 
       orderby c.Name 
       select new SelectListItem() {Text = c.Name, Value = c.ID}); 


    } 

Вопрос не если это возможно, но если это нормально в соответствии с тем, как MVC из делать вещи. (Или я должен поместить коллекцию стран в ViewData внутри контроллера?)

ответ

3

Я передавал данные в качестве параметра методу GetCountries. Функция htmlHelper действительно не должна знать о свойствах вашего базового контроллера - что, если кто-то когда-либо использовал его на контроллере, который не наследуется от вашей базы? Я знаю, что знаю, ты управляешь кодом, бла-бла. Если вы действительно заинтересованы в передовом опыте, избегайте зависимости.

public static IEnumerable<SelectListItem> GetCountries(this HtmlHelper html, Countries countries) { 
    return from c in countries 
      order by c.Name 
      select new SelectListItem 
      { 
       Text = c.Name, 
       Value = c.ID 
      }; 
} 

тогда, на ваш взгляд:

<%=Html.GetCountries(this.Entities.Countries)%> 
+0

Но как я могу получить страны внутри моего ViewPage? Основной элемент в моей ViewPage - это IEnumerable . Поэтому я должен поместить коллекцию стран в ViewData (ViewData ["countries"]). Код указывает, что вы создаете новую ViewPage, которая наследует исходную ViewPage и которая добавляет свойство Entities (также похоже на большую зависимость). – Gidon

+3

Вы можете создать viewmodel, который содержит как города, так и страны. – Morph

+0

Я чувствую, что иногда ViewModel хорош, но, используя его для каждой страницы (потому что многие страницы состоят из основных данных, с некоторыми дополнительными данными), просто создает так много ViewModels, что я задаюсь вопросом, все ли это выгодно. – Gidon

1

ЗАКАНЧИВАТЬ шаблон ViewModel, он упоминается в NerdDinner учебнике: http://nerddinnerbook.s3.amazonaws.com/Part6.htm

В основном вы создаете класс ViewModel, который инкапсулирует все данные, может потребоваться для вашего просмотра. Таким образом, у вас будет класс, содержащий список всех городов и/или стран, и все остальное, созданное/заполняемое в действии контроллера.

Затем вы можете строго ввести свое представление, чтобы использовать этот класс ViewModel, и blammo: у вас есть все данные, необходимые для вашей формы.

+1

Да, я знаю шаблон ViewModel, и я также использую его для некоторых случаев. Но также найти в некоторых случаях это перебор. Я собираюсь использовать этот список стран во многих местах, что будет означать, что мне нужно создать тонну ViewModels ... – Gidon

+0

Возможно, стоит сделать базовый класс, который содержит страны, и просто наследовать от него, когда это необходимо. Но в конечном счете, да, если у вас много просмотров, вам понадобится много моделей просмотра. Кроме того, я не сделал этого, но вы можете попробовать передать анонимные типы в свои представления, а затем вы можете создавать ViewModels «на лету». –

0

Я думаю, что html helper должен возвращать html. Так у вас есть два подхода:

первый, если вы хотите сделать это, как вы начали с вашей HtmlHelper подготовить список элементов, а затем вызвать html.RenderDropDown с инициализированную списка, выбранного элемента и т.д ...

вторых, вы можете все подготовить в вашей модели, поэтому контроллер будет передавать инициирована объект со всеми элементами, вам нужно так в просмотре вы можете позвонить renderdropdown непосредственно

приветствий

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