it-swarm-ru.tech

Передача данных на главную страницу в ASP.NET MVC

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

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

102
Łukasz Sowa

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

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

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.

77
Generic Error

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

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

РЕДАКТИРОВАТЬ

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

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

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

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

20
Michael La Voie

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

7
Ian P
3
David Negron

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

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

2
Matt Mitchell

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

0
dimarzionist

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

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

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

0
mtutty