Каков ваш способ передачи данных на главную страницу (используя ASP.NET MVC) без нарушения правил MVC?
Лично я предпочитаю кодировать абстрактный контроллер (базовый контроллер) или базовый класс, который передается ко всем представлениям.
Каков ваш способ передачи данных на главную страницу (используя ASP.NET MVC) без нарушения правил MVC?
Лично я предпочитаю кодировать абстрактный контроллер (базовый контроллер) или базовый класс, который передается ко всем представлениям.
Если вы предпочитаете, чтобы ваши представления имели строго типизированные классы данных просмотра, это может сработать для вас. Другие решения, вероятно, более правильные, но это хороший баланс между дизайном и практичностью 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.
Я предпочитаю разбивать обработанные данными части основного представления на частичные и рендеринг их с помощью Html.RenderAction. Это имеет несколько отличительных преимуществ по сравнению с популярным методом наследования модели представления:
ИЗМЕНИТЬ
Общая ошибка предоставила лучший ответ ниже. Пожалуйста, прочтите его!
Оригинальный ответ
Microsoft фактически разместила запись на "официальный" способ. Это обеспечивает пошаговое прохождение с объяснением их рассуждений.
Короче говоря, они рекомендуют использовать абстрактный класс контроллера, но убедитесь сами.
Абстрактные контроллеры - хорошая идея, и я не нашел лучшего способа. Мне интересно узнать, что сделали другие люди.
Я провел некоторое исследование и наткнулся на эти два сайта. Может быть, они могут помочь.
Совет ASP.NET MVС# 31 - Передача данных на главные страницы и пользовательские элементы управления
Я нахожу, что общий родительский объект для всех объектов модели, которые вы передаете в представление, исключительно полезен.
В любом случае всегда будут существовать некоторые общие свойства модели между страницами.
Объект 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.