将ViewData传递给ASP.NET MVC母版页

6
我正在尝试将ViewData传递给我的asp.net mvc母版页,以便在母版页上保留mvc用户控件。例如,我创建了一个名称下拉列表作为mvc用户控件,并将其放在母版页上。
我遇到的问题是将ViewData传递到母版页。我找到了来自Microsoft的这篇文章,其中有一个不错的解决方案,但我想知道是否还有其他更好的解决方案。我不喜欢链接中的解决方案之一,因为我必须更改每个控制器以继承新的控制器类。

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

编辑:我正在研究的问题是,如果我在我的母版页中放置一个依赖于ViewData的用户控件,那么我必须为每个使用该母版页的页面重复包含该ViewData。上面链接中的解决方案可能是最佳解决方案,但我希望还有其他选择。
6个回答

4

主页已经可以访问 ViewData。如果您想要强类型访问它,需要执行两个操作:

  1. 将主页内容放入基类中(例如 CommonViewData)
  2. 使您的主页继承泛型 ViewMasterPage<> 类:

    " %>

1
我正在研究的问题是,如果我在我的母版页中放置一个依赖于ViewData的用户控件,那么我必须为每个使用该母版页的页面都包含该ViewData。 - codette

2

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

就像这样:

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

I haven't tried it so it's just a thought...


1

就我个人而言,我正在当前项目中使用那个教程中的方法,它非常有效。

如果数据有点静态(比如菜单不经常更改),您还可以将对象放在缓存中,这样您的数据库就不会在每次控制器初始化时被调用。


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);
}

简洁明了,谢谢!四年后终于得到了一个赞;) - Stachu

0

我认为所提出的解决方案确实可行,但并不是理想的解决方案。如果我们将代码放在BaseController构造函数中,它将被调用甚至对于没有MasterPages的Action方法(例如Post方法和Ajax方法)。
我认为一个更好的解决方案(不是理想的)是在Master页面中调用Html.Action方法。


0

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

我现在遇到的问题是,如果我在我的母版页中放置一个依赖于ViewData的用户控件,那么每个使用该母版页的页面都必须重复包含该ViewData。

当然了... 如果你在母版页中有一个用户控件,那么你肯定需要为每个使用该母版页的操作和视图传递该用户控件所需的数据。

如果你只是从基础控制器继承而来,那么你并不需要重复自己。

你的问题是某些控制器具有既调用又不调用从特定母版页派生的视图的操作吗?因此,如果你正在实现一个基础控制器,那么不使用该特定母版页的操作仍将具有其ViewData...?(如果这一切都说得通的话;-)


我提出这个问题的原因是想看看是否有替代方案来解决我在原问题中提到的链接中提供的解决方案。但我猜微软会发布他们能想到的“最佳”解决方案。 - codette

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接