Как создать строго типизированную главную страницу с использованием базового controllerа в ASP.NET MVC
Следуя примеру NerdDinners , я заинтересован в создании строго типизированной главной страницы. Для этого я использую базовый controller, который извлекает данные для главной страницы. Все остальные controllerы наследуют этот class. Аналогично, у меня есть ViewModels
для главной страницы и любых других видов. Классы ViewModel
вида наследуются от ViewModel
главной страницы.
Вопрос
Как должен дочерний controller обеспечить передачу данных главной страницы в представление без установки свойств его ViewModel
которые относятся к самой главной странице?
Моя главная страница отобразит несколько кнопок, которые определены в XML-файле, и, следовательно, class Buttons
который я заполняю.
- ASP.NET MVC Html.DropDownList SelectedValue
- Crystal Reports в ASP.NET MVC
- Внедрить repository для пользовательского поставщика членства с Ninject
- asp.net MVC 4 многопользовательская почта через различные формы
- где лучшее место для сохранения изображений с пользователей
Фрагмент кода 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
.
- Группа переключателей ASP.NET MVC 5
- Можно ли компилировать виды Razor?
- Вернуть строку JSON явно из Asp.net WEBAPI?
- MVC, кнопка отправки которого нажата
- Как перенести модели данных на частичные виды?
- Атрибут DisplayName из ресурсов?
- Вернуть XML из действия controllerа в ActionResult?
- Объединить MyDbContext с IdentityDbContext
Вы можете создать фильтр, выполненный после действия, который ищет модель этого типа и соответственно устанавливает свойства, возможно, вызвав функцию базового 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 и поставить там код инициализации? Кажется немного проще.