Como criar uma página mestre fortemente tipada usando um controlador base no ASP.NET MVC
Seguindo o NerdDinners exemplo, estou interessado em criar uma Página Mestre fortemente tipada. Para conseguir isso, eu uso um controlador de base que recupera os dados para a página mestre. Todos os outros controladores herdam essa classe. Da mesma forma, eu tenhoViewModels
para a página principal e quaisquer outras visualizações. A vistaViewModel
classes herdadas da @ página mestViewModel
.
Como um controlador filho deve garantir que os dados da página mestre sejam passados para a Visualização sem definir as propriedades de seusViewModel
que pertencem à própria página mestra?
A minha página mestre exibirá vários botões, que são determinados em um arquivo XML, portanto, oButtons
classe que estou preenchendo.
MasterPage ViewModel Code Snippet
using System.Collections.Generic;
namespace Site1.Models
{
public class MasterViewModel
{
public List<Button> Buttons{set; get;}
}
}
VisãoViewModel
namespace Site1.Models
{
public class View1ViewModel : MasterViewModel
{
public SomeDataClass SomeData { get; set; }
}
}
Base Controllerusing 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<Button>();
//populate the button classes (doesn't matter how)
PopulateButtons(model.Buttons);
}
}
}
Controlador da vista:
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);
}
}
}
A página mestra herdaSystem.Web.Mvc.ViewMasterPage<Site1.Models.MasterViewModel>
.
A vista herdaSystem.Web.Mvc.ViewMasterPage<Site1.Models.View1ViewModel>
.