MVC - Передача дополнительной информации для просмотра - PullRequest
3 голосов
/ 04 февраля 2011

Я занимаюсь разработкой веб-сайта с использованием инфраструктуры Asp.Net MVC.Нам нужно добавить общую информацию о пользователях на нескольких страницах, аналогично панели репутации в верхней части переполнения стека.

Я считаю важным, чтобы при созданииметод контроллера, чтобы добавить эту дополнительную информацию к представлению.Это исключает возможность передачи этой информации в объект ViewData или внесения поправок в ViewModels для принятия поля репутации, так как каждый контроллер будет выглядеть следующим образом:

public ActionResult Index()
{
    ViewData["reputationScore"] = GetUsersReputation(userId);

    // main controller logic here
}

Если это используется в 90% случаевстраниц на сайте, это может занять много времени, если мы также хотим отобразить счетчик значков пользователей.

Я могу придумать 4 решения этой

Использование главных страниц Извлеките репутацию пользователя из кода главной страницы и поместите отметку для репутации в разметку главной страницы.

Недостатки:

  1. Похоже, это отходит от всего, что представляет MVC.
  2. Я рассчитывал перейти на использование альтернативных движков вида (например, бритвы). Я не уверен, насколько хорошо они будут смешиваться.
  3. Это имеет тенденцию ограничивать макет репутации - трудно поместить его в середину страницы.

Расширьте HtmlHelper, чтобы добавить метод GetUsersReputation Это, кажется, небольшое нарушение того, для чего должен использоваться объект Html - это не просто рендеринг вывода, но попадание в базу данных.Я не могу думать ни о каких других существенных проблемах с этим, кроме нарушения метафоры.

Переопределение System.Web.Mvc.ViewPage Переопределение Viewpage для предоставления объекта в дополнение кHTML, который можно использовать для вызова выбора методов, которые обращаются к базе данных.Убедитесь, что методы расширения могут быть добавлены так же, как HtmlHelper, так что, когда и когда нужны новые методы, они могут быть расширены соответствующим образом.Это может позволить нам написать что-то вроде:

<% DataAccess.GetUsersReputation() %>

Создать базовую модель общего вида Вместо того, чтобы передавать модель представления прямо в представление, оберните ее в модель базового представления, которая можетхраните все необходимые методы:

public ActionResult Index()
{
    MyViewModel viewCoreInfo = model.GetData();

    return View(new BaseViewModel<MyViewModel>(viewCoreInfo));
}

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

  1. Кто-то еще придумал лучшее решение
  2. Чтолучше всего - если вы их использовали, были ли они эффективны / проблематичны?

Ответы [ 5 ]

3 голосов
/ 04 февраля 2011

Почему бы вам не позволить MyViewModel наследовать BaseViewModel?

. Вы можете использовать BaseController.OnResultExecuting для заполнения общих значений:

protected override void OnResultExecuting(ResultExecutingContext ctx) {
    base.OnResultExecuting(ctx);
    var baseView = ctx.Result as BaseViewModel;
    if (baseView != null)
    {
        //assign values here
    }
}
3 голосов
/ 04 февраля 2011

Поскольку вы упомянули о возможности перехода к движку просмотра бритвы, я думаю, что ЭТОТ пост в блоге ScottGu может быть интересен.

Он обсуждает использование "разделов" с бритвой, чтоПозволит вам создать раздел на вашем Макете ("Masterpage"), который вы можете загрузить с дополнительным контентом.Создание информационной панели в стиле SO таким образом было бы простым и понятным.

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

Что касается частичного представления в соответствии с комментариями ниже ... theУ нового mvc music store есть несколько примеров.

В этом случае они используют Html.RenderAction.Html.RenderPartial - это еще один вариант.Различия изложены в этом вопросе , но я уверен, что в сети есть другие ресурсы.

Ваш контроллер просто вернет частичное представление как таковое:

 return PartialView();
1 голос
/ 05 февраля 2011

Вы можете создать фильтр действий, переопределить OnResultExecuting, заполнить общие значения и добавить его в ваш action / controller:

public class AddCommonData : ActionFilterAttribute 
{
  public override void OnResultExecuting(ResultExecutingContext filterContext)
  {
    ViewResult viewResult = filterContext.Result as ViewResult;
    if (viewResult != null)
    {
      //...
    } 
  }
}
0 голосов
/ 04 февраля 2011

Вы можете создать частичное представление с файлом codebehind, где вы будете заполнять частичное представление данными. Это немного не-mvc способ, но он будет работать.

0 голосов
/ 04 февраля 2011

Я сделал это и создал класс базовой модели со всей общей информацией. Весь мой другой класс viewmodel наследуется от этого. Но вы должны заполнить в каждом контроллере эту информацию. Это решение, которое я выбрал.

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