将强类型数据传递给ViewMasterPage和ViewPage

时间:2010-08-19 03:43:50

标签: c# asp.net asp.net-mvc

这是一个反复重复的话题,我仍然对所有部分如何组合在一起感到不舒服: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?

1 个答案:

答案 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>" %>