Как вы можете передавать данные на главную страницу (используя ASP.NET MVC), не нарушая правил MVC?
Лично я предпочитаю кодировать абстрактный контроллер (базовый контроллер) или базовый класс, который передается во все представления.
Как вы можете передавать данные на главную страницу (используя ASP.NET MVC), не нарушая правил MVC?
Лично я предпочитаю кодировать абстрактный контроллер (базовый контроллер) или базовый класс, который передается во все представления.
Если вы предпочитаете, чтобы ваши представления имели строго типизированные классы данных представления, это может сработать для вас. Другие решения, вероятно, более правильные, но это хороший баланс между дизайном и практичностью ИМХО.
Главная страница принимает строго типизированный класс данных представления, содержащий только относящуюся к нему информацию:
public class MasterViewData
{
public ICollection<string> Navigation { get; set; }
}
Каждое представление, использующее эту главную страницу, принимает строго типизированный класс данных представления, содержащий его информацию и производный от данных представления главных страниц:
public class IndexViewData : MasterViewData
{
public string Name { get; set; }
public float Price { get; set; }
}
Поскольку я не хочу, чтобы отдельные контроллеры знали что-либо о сборке данных мастер-страниц, я инкапсулирую эту логику в фабрику, которая передается каждому контроллеру:
public interface IViewDataFactory
{
T Create<T>()
where T : MasterViewData, new()
}
public class ProductController : Controller
{
public ProductController(IViewDataFactory viewDataFactory)
...
public ActionResult Index()
{
var viewData = viewDataFactory.Create<ProductViewData>();
viewData.Name = "My product";
viewData.Price = 9.95;
return View("Index", viewData);
}
}
Наследование соответствует мастеру, чтобы хорошо просматривать отношения, но когда дело доходит до рендеринга партиалов / пользовательских элементов управления, я объединяю их данные просмотра в данные просмотра страниц, например
public class IndexViewData : MasterViewData
{
public string Name { get; set; }
public float Price { get; set; }
public SubViewData SubViewData { get; set; }
}
<% Html.RenderPartial("Sub", Model.SubViewData); %>
Это только пример кода и не предназначен для компиляции как есть. Разработан для ASP.Net MVC 1.0.
where T : MasterViewData, new() сообщает компилятору, что метод Create может быть вызван только для типов, которые расширяют MasterViewData (что IndexViewData делает в этом случае) и которые используют конструктор по умолчанию или конструктор без параметров. Другими словами, я должен уметь сказать MasterViewData data = new T();.
- person StriplingWarrior; 16.07.2010
Navigation?
- person IsmailS; 19.03.2011
Я предпочитаю разбивать управляемые данными части главного представления на части и визуализировать их с помощью Html.RenderAction. У этого есть несколько явных преимуществ по сравнению с популярным подходом наследования модели представления:
Html.RenderAction, который извлекает выгоду из DI и всего остального. Это правда? Есть ли какой-либо риск, позволяя умным пользователям запрашивать одно из этих действий напрямую? Есть способ предотвратить это?
- person flipdoubt; 03.03.2012
ИЗМЕНИТЬ
Общая ошибка предоставила лучший ответ ниже. Пожалуйста, прочтите!
Исходный ответ
Microsoft фактически разместила запись на "официальном" способе чтобы справиться с этим. Это обеспечивает пошаговое руководство с объяснением их аргументов.
Короче говоря, они рекомендуют использовать абстрактный класс контроллера, но убедитесь сами.
Абстрактные контроллеры - хорошая идея, и я не нашел лучшего способа. Мне также интересно посмотреть, что сделали другие люди.
Я провел небольшое исследование и наткнулся на эти два сайта. Может, они смогут помочь.
Передача данных на главные страницы с помощью ASP.NET MVC
Я считаю, что общий родительский элемент для всех объектов модели, которые вы передаете в представление, исключительно полезен.
В любом случае между страницами всегда будут иметься некоторые общие свойства модели.
Объект Request.Params является изменяемым. Довольно легко добавить к нему скалярные значения в рамках цикла обработки запроса. С точки зрения представления, эта информация могла быть предоставлена в QueryString или FORM POST. hth
Я считаю, что еще одним хорошим способом может быть создание интерфейса для просмотра с некоторым свойством, таким как ParentView некоторого интерфейса, поэтому вы можете использовать его как для элементов управления, которым нужна ссылка на страницу (родительский элемент управления), так и для основных представлений, к которым следует обращаться из взгляды.
Другим решениям не хватает элегантности и они требуют слишком много времени. Прошу прощения за то, что сделал это очень грустное и убогое дело почти год спустя:
<script runat="server" type="text/C#">
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
MasterModel = SiteMasterViewData.Get(this.Context);
}
protected SiteMasterViewData MasterModel;
</script>
Итак, у меня есть статический метод Get () для SiteMasterViewData, который возвращает SiteMasterViewData.