这是一个反复重复的话题,我仍然对所有部分如何组合在一起感到不舒服:ViewPage / ViewMasterPage,ViewPage.Model,等等。
我已经进入了一项事业,其中必须将模型数据传递给MasterPage和从中派生的ViewPage。传递下来的数据不需要在MasterPage和ViewPage之间共享,以防万一。
我最终的解决方案感觉就像是一个黑客工作:
1。我抽象了Controller并覆盖了OnActionExecuted方法:MasterViewPage使用 ViewMasterPage.Model
访问其数据 protected override void OnActionExecuted(ActionExecutedContext filterContext) {
ViewData.Model = new CPanelViewData() { Errors = Errors, Warnings = Warnings, Notifications = Notifications };
base.OnActionExecuted(filterContext);
}
2。我在我的Action方法中使用了Controller.View(字符串viewName,对象模型):ViewPage是通用的,即ViewPage< FileManagerViewPage>
public class FileManagerControlPanelController : CPanelController
{
private FileManagerViewPage viewPage = new FileManagerViewPage();
public ActionResult AddFolder(string name, string path) {
...
...
return View("Index", viewPage);
}
所有这一切,我想知道这个解决方案是否合法。有没有更好的方法将模型数据提供给MasterPage和View?
答案 0 :(得分:0)
为了那些最终与我相同的人,我会详细阐述我和之相处的解决方案。
<强> 1。我创建了一个抽象类,代表主视图模型。
public abstract class CpFileMgrMasterViewModel { ... }
<强> 2。我创建了一个继承的类,它代表 View Page Model。
public class CpFileMgrViewModel:CpFileMgrMasterViewModel { ... }
第3。我创建了一个抽象的通用控制器,它提供了处理主模型并接受视图模型类型为TModel的方法。
public abstract class CpFileMgrController<TModel>:Controller
where TModel: class, new()
{
private TModel _model = new TModel();
public TModel Model{ get{ return _model; } }
public CpFileMgrController() {
ViewData.Model = _model;
}
}
<强> 4。我使用上面的两个类将主视图和视图页面放入其通用表单中:
<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage<CpFileMgrMasterViewModel>" %>
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/....Master"
Inherits="System.Web.Mvc.ViewPage<CpFileMgrViewModel>" %>