将viewdata传递给asp.net mvc masterpages

时间:2009-03-31 07:27:05

标签: asp.net-mvc master-pages viewdata

我正在尝试将ViewData传递到我的asp.net mvc主页,以获取我保留在母版页上的mvc usercontrol。例如,我创建了一个名称下拉列表作为mvc usercontrol,我把它放在我的母版页中。

我遇到的问题是将ViewData传递给母版页。我发现微软的这篇文章有一个不错的解决方案,但我想知道是否还有其他“更好”的解决方案。我不喜欢链接中的解决方案是我必须将每个控制器更改为从新控制器类继承。

http://www.asp.net/learn/MVC/tutorial-13-cs.aspx

编辑:我看到的问题是,如果我将用户控件放在依赖于ViewData的母版页中,我必须重复包含该ViewData对于使用所述母版页的每个页面。上述链接中的解决方案可能是最佳解决方案,但我希望还有其他替代方案。

6 个答案:

答案 0 :(得分:4)

母版页已经可以访问ViewData。如果您想要强类型访问它,您需要做两件事:

  1. 将母版页内容放在基类(例如CommonViewData)
  2. 您是否掌握了从通用ViewMasterPage<>继承的页面?类:

    “%>

答案 1 :(得分:2)

您是否可以在基本控制器类上使用OnActionExecuting方法并在那里填充视图数据?

类似的东西:

protected override void OnActionExecuting(ActionExecutingContext context)
{
  context.Controller.ViewData.Model = GetDataForControl();
}

我没有尝试过,所以这只是一个想法...

答案 2 :(得分:1)

对于它的价值,我在当前项目中使用该教程中的方法,并且它运行良好。

如果数据有点静态(如菜单变化不大),你还可以做的是将对象放在缓存中,这样就不会为每个控制器初始化调用数据库。 / p>

答案 3 :(得分:1)

我通常为我的MasterPage使用抽象控制器类,这是最好的解决方案,因为MasterPage就像一个“抽象视图”。但我重写了MasgerPageController View()方法以包含viewdata。

protected override ViewResult View(string viewName, string masterName, object model)
{
    this.ViewData["menu"] = this.PagesRepository.GetPublishPages();
    return base.View(viewName, masterName, model);
}

答案 4 :(得分:0)

我不太明白你的问题......

  

我正在考虑的问题是,如果我将用户控件放在依赖于ViewData的母版页中,我必须为使用所述母版页的每个页面重复包含该ViewData。

嗯,是的......你当然可以。如果您的母版页中有用户控件,那么您当然必须为每个操作传递该用户控件所需的数据。使用该主页的视图。

如果您只是从基本控制器继承,那么您不必重复自己。

您的问题是否是某些控制器具有同时执行和不调用源自该特定母版页的视图的操作的事实?因此,如果您正在实现基本控制器,那些不使用该特定母版页的操作仍将具有该视图数据...? (如果一切都有意义的话 - )

答案 5 :(得分:0)

我认为建议的解决方案确实有效但不是理想的解决方案。如果我们将代码放在BaseController构造函数中,即使对于没有MasterPages的Action方法(例如Post方法和Ajax方法)也会调用它。
我认为更好的解决方案(不理想)是在Master页面中调用Html.Action方法。