Как создать строго типизированную главную страницу с использованием базового controllerа в ASP.NET MVC

Следуя примеру NerdDinners , я заинтересован в создании строго типизированной главной страницы. Для этого я использую базовый controller, который извлекает данные для главной страницы. Все остальные controllerы наследуют этот class. Аналогично, у меня есть ViewModels для главной страницы и любых других видов. Классы ViewModel вида наследуются от ViewModel главной страницы.

Вопрос

Как должен дочерний controller обеспечить передачу данных главной страницы в представление без установки свойств его ViewModel которые относятся к самой главной странице?

Моя главная страница отобразит несколько кнопок, которые определены в XML-файле, и, следовательно, class Buttons который я заполняю.

Фрагмент кода ViewModel для MasterPage

 using System.Collections.Generic; namespace Site1.Models { public class MasterViewModel { public List

Просмотр ViewModel

 namespace Site1.Models { public class View1ViewModel : MasterViewModel { public SomeDataClass SomeData { get; set; } } } 

Базовый controller

 using System.Collections.Generic; using System.Web.Mvc; using Site1.Models; namespace Site1.Controllers { public abstract class BaseController : Controller { protected MasterViewModel model = new MasterViewModel(); public BaseController() { model.Buttons = new List

Контроллер вида:

 using System.Web.Mvc; namespace Site1.Controllers { public class View1Controller : BaseController { public ActionResult Index() { Models.View1ViewModel viewModel = new Models.View1ViewModel(); SomeDataClass viewData = new SomeDataClass() //populate data class (doesn't matter how) PopulateDataClass(viewData); viewModel.SomeData = viewData; //I WANT TO ELIMINATE THE FOLLOWING LINE! viewModel.Buttons = model.Buttons; return View("Index", viewModel); } } } 

Главная страница наследует System.Web.Mvc.ViewMasterPage .

Представление наследует System.Web.Mvc.ViewMasterPage .

Вы можете создать фильтр, выполненный после действия, который ищет модель этого типа и соответственно устанавливает свойства, возможно, вызвав функцию базового controllerа. Затем вы помещали фильтр в базовый class, и все действия увидели бы его автоматически.

Атрибут фильтра действий получает ViewModel controllerа и передает его функции SetModel controllerа:

 using System.Web.Mvc; using Site1.Controllers; namespace Site1.Models { public class MasterAttribute : ActionFilterAttribute { public override void OnActionExecuted(ActionExecutedContext filterContext) { base.OnActionExecuted(filterContext); MasterViewModel viewModel = (MasterViewModel)((ViewResultBase)filterContext.Result).ViewData.Model; BaseController controller = (BaseController)filterContext.Controller; controller.SetModel(viewModel); } } } 

Эта функция добавляется в BaseController :

 public void SetModel(MasterViewModel childViewModel) { childViewModel.Buttons = model.Buttons; } 

Вместо того, чтобы создавать атрибут, почему бы не просто переопределить Controller.OnActionExecuted и поставить там код инициализации? Кажется немного проще.

  • Можем ли мы передать модель в качестве параметра в RedirectToAction?
  • Предоставление частичного просмотра при нажатии кнопки в ASP.NET MVC
  • Как отключить состояние сеанса в ASP.NET MVC?
  • Лучший способ обрезать строки после ввода данных. Должен ли я создать настраиваемое связующее устройство?
  • Нужен многостраничный процесс ASP.NET MVC с обратной связью с пользователем
  • Отображать значение DateTime в формате dd / mm / yyyy в Asp.NET MVC
  • Использование MySql с Entity Framework 4 и Code-First Development CTP
  • Как «разогревать» Entity Framework? Когда он становится «холодным»?
  • Как передать данные json POST в метод Web API как объект?
  • Как зарегистрировать пользователя, когда они закрывают свой браузер или вкладку в ASP.NET MVC?
  • Как удалить функциональность подразделения из репозиториев с помощью IOC
  • Давайте будем гением компьютера.