Передача данных на главную страницу в ASP.NET MVC
Каков ваш способ передачи данных на главную страницу (используя ASP.NET MVC) без нарушения правил MVC?
Лично я предпочитаю кодировать абстрактный контроллер (базовый контроллер) или базовый класс, который передается ко всем представлениям.
Ответы
Ответ 1
Если вы предпочитаете, чтобы ваши представления имели строго типизированные классы данных просмотра, это может сработать для вас. Другие решения, вероятно, более правильные, но это хороший баланс между дизайном и практичностью IMHO.
Мастер-страница использует строго типизированный класс данных вида, содержащий только соответствующую ему информацию:
public class MasterViewData
{
public ICollection<string> Navigation { get; set; }
}
Каждое представление, использующее эту главную страницу, использует строго типизированный класс данных представления, содержащий его информацию и получаемый из данных просмотра основных страниц:
public class IndexViewData : MasterViewData
{
public string Name { get; set; }
public float Price { get; set; }
}
Поскольку я не хочу, чтобы отдельные контроллеры знали что-либо о объединении данных основных страниц, я инкапсулирую эту логику в factory, которая передается каждому контроллеру:
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.
Ответ 2
Я предпочитаю разбивать обработанные данными части основного представления на частичные и рендеринг их с помощью Html.RenderAction. Это имеет несколько отличительных преимуществ по сравнению с популярным методом наследования модели представления:
- Данные главного представления полностью отделены от "обычных" моделей представлений. Это состав над наследованием и приводит к более слабосвязанной системе, которую легче изменить.
- Модели основного вида создаются полностью отдельным действием контроллера. "Регулярные" действия не нужно беспокоиться об этом, и нет необходимости в представлении данных factory, что кажется слишком сложным для моих вкусов.
- Если вы используете инструмент, например AutoMapper, чтобы сопоставить свой домен с моделями просмотра, вам будет проще настроить потому что ваши модели просмотра будут в большей степени напоминать ваши модели домена, если они не наследуют данные основного вида.
- С помощью отдельных методов действий для основных данных вы можете легко применить кэширование вывода к определенным областям страницы. Обычно мастер-представления содержат данные, которые изменяются реже, чем содержимое главной страницы.
Ответ 3
ИЗМЕНИТЬ
Общая ошибка предоставила лучший ответ ниже. Пожалуйста, прочтите его!
Оригинальный ответ
Microsoft фактически разместила запись на "официальный" способ. Это обеспечивает пошаговое прохождение с объяснением их рассуждений.
Короче говоря, они рекомендуют использовать абстрактный класс контроллера, но убедитесь сами.
Ответ 4
Абстрактные контроллеры - хорошая идея, и я не нашел лучшего способа. Мне интересно узнать, что сделали другие люди.
Ответ 5
Я провел некоторое исследование и наткнулся на эти два сайта. Может быть, они могут помочь.
Совет ASP.NET MVС# 31 - Передача данных на главные страницы и пользовательские элементы управления
Передача данных на главные страницы с помощью ASP.NET MVC
Ответ 6
Я нахожу, что общий родительский объект для всех объектов модели, которые вы передаете в представление, исключительно полезен.
В любом случае всегда будут существовать некоторые общие свойства модели между страницами.
Ответ 7
Объект Request.Params изменен. Довольно легко добавить к нему скалярные значения как часть цикла обработки запросов. С точки зрения зрения эта информация могла быть предоставлена в QueryString или FORM POST. HTH
Ответ 8
Мне кажется, что еще один хороший способ - создать интерфейс для представления с некоторым свойством вроде ParentView какого-либо интерфейса, поэтому вы можете использовать его как для элементов управления, которым нужна ссылка на страницу (родительский элемент управления), так и на основные виды, которые должны доступ к ним из представлений.
Ответ 9
В других решениях нет элегантности и занимает слишком много времени. Я прошу прощения за то, что сделал это очень грустное и обедневшее дело почти целый год спустя:
<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.