Передача данных на главную страницу в 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

Абстрактные контроллеры - хорошая идея, и я не нашел лучшего способа. Мне интересно узнать, что сделали другие люди.

Ответ 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.