按照
NerdDinners的例子,我有兴趣创建一个强类型的主页。为了实现这一点,我使用一个基本控制器来检索主页面的数据。所有其他控制器继承此类。类似地,我有主页面和任何其他视图的viewmodels。 viewmodel类的视图继承自主页面的viewmodel。
题
子控制器应如何确保将母版页的数据传递给视图,而不设置与主页本身相关的viewmodel的属性?
我的主页面将显示一些按钮,这些按钮是在XML文件中确定的,因此我正在填充的Buttons类。
using System.Collections.Generic; namespace Site1.Models { public class Masterviewmodel { public List<Button> Buttons{set; get;} } }
查看viewmodel
namespace Site1.Models { public class View1viewmodel : Masterviewmodel { public SomeDataClass SomeData { get; set; } } }
基控制器
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<Button>(); //populate the button classes (doesn't matter how) PopulateButtons(model.Buttons); } } }
视图的控制器:
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< Site1.Models.Masterviewmodel> ;. 视图继承了System.Web.Mvc.ViewMasterPage< Site1.Models.View1viewmodel> ;.
解决方法
您可以创建一个动作后执行的过滤器,该过滤器查找该类型的模型,并相应地设置属性,也许通过调用基本控制器功能。然后,您将过滤器放在基类上,所有操作将自动查看。
动作过滤器属性获取控制器的viewmodel,并将其传递给控制器的SetModel函数:
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); } } }
public void SetModel(Masterviewmodel childviewmodel) { childviewmodel.Buttons = model.Buttons; }