Передача данных на главную страницу в ASP.NET MVC - PullRequest
102 голосов
/ 17 сентября 2008

Как вы можете передавать данные на главную страницу (используя ASP.NET MVC) без нарушения правил MVC?

Лично я предпочитаю кодировать абстрактный контроллер (базовый контроллер) или базовый класс, который передается всем представлениям.

Ответы [ 9 ]

77 голосов
/ 14 апреля 2009

Если вы предпочитаете, чтобы ваши представления имели строго типизированные классы данных представления, это может сработать для вас. Другие решения, вероятно, более правильные , но это хороший баланс между дизайном и практичностью ИМХО.

Главная страница принимает класс данных со строго типизированным представлением, содержащий только информацию, относящуюся к ней:

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.

59 голосов
/ 10 августа 2010

Я предпочитаю разбивать управляемые данными части главного представления на партиалы и отображать их, используя Html.RenderAction . Это имеет несколько явных преимуществ по сравнению с популярным подходом наследования моделей представлений:

  1. Данные основного вида полностью отделены от "обычных" моделей представления. Это композиция по наследованию и приводит к более слабосвязанной системе, которую легче изменить.
  2. Модели Master View создаются с помощью совершенно отдельного действия контроллера. «Обычные» действия не должны беспокоиться об этом, и нет необходимости в фабрике данных представления, которая кажется слишком сложной для моих вкусов.
  3. Если вам случится использовать такой инструмент, как AutoMapper , для сопоставления вашего домена с вашими моделями представлений, вам будет проще настраивать, потому что ваши модели представлений будут больше похожи на модели вашего домена, когда они не t наследуют данные основного вида.
  4. С помощью отдельных методов действий для основных данных вы можете легко применить кеширование вывода к определенным областям страницы. Обычно основные виды содержат данные, которые изменяются реже, чем содержимое главной страницы.
20 голосов
/ 04 июня 2009

EDIT

Общая ошибка предоставил лучший ответ ниже. Пожалуйста, прочитайте это!

Оригинальный ответ

Microsoft фактически опубликовала запись на "официальном" способе , чтобы справиться с этим. Это обеспечивает пошаговое объяснение их рассуждений.

Короче говоря, они рекомендуют использовать абстрактный класс контроллера, но убедитесь сами.

7 голосов
/ 17 сентября 2008

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

3 голосов
/ 17 сентября 2008
2 голосов
/ 17 сентября 2008

Я считаю, что общий родительский элемент для всех объектов модели, передаваемых в представление, исключительно полезен.

В любом случае, между страницами всегда будут общие свойства модели.

0 голосов
/ 30 сентября 2009

Другим решениям не хватает элегантности и они занимают слишком много времени. Я прошу прощения за то, что сделал это очень печальное и обедневшее событие почти целый год спустя:

<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.

0 голосов
/ 17 сентября 2008

Я считаю, что другим хорошим способом может быть создание интерфейса для представления с некоторым свойством, например ParentView, для некоторого интерфейса, так что вы можете использовать его как для элементов управления, которым требуется ссылка на страницу (родительский элемент управления), так и для основных представлений, которые должны быть доступным из просмотров.

0 голосов
/ 17 сентября 2008

Объект Request.Params является изменяемым. Довольно легко добавить к нему скалярные значения как часть цикла обработки запросов. С точки зрения представления, эта информация могла быть предоставлена ​​в QueryString или FORM POST. НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...