Как вы можете передавать данные на главную страницу (используя 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.
Я предпочитаю разбивать управляемые данными части главного представления на части и визуализировать их с помощью Html.RenderAction . У этого есть несколько явных преимуществ по сравнению с популярным подходом наследования модели представления:
РЕДАКТИРОВАТЬ
Generic Error предоставил лучший ответ ниже. Пожалуйста, прочтите!
Оригинальный ответ
Microsoft фактически опубликовала запись об «официальном» способе решения этой проблемы. Это дает пошаговое руководство с объяснением их аргументов.
Короче говоря, они рекомендуют использовать абстрактный класс контроллера, но убедитесь сами.
Я провел небольшое исследование и наткнулся на эти два сайта. Может, они смогут помочь.
Я считаю, что общий родительский элемент для всех объектов модели, которые вы передаете в представление, исключительно полезен.
В любом случае между страницами всегда будут иметься некоторые общие свойства модели.
Объект 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.