6

我正在尝试将 ViewData 传递给我的 asp.net mvc 母版页,以获得我保留在母版页上的 mvc 用户控件。例如,我创建了一个名称下拉列表作为 mvc 用户控件,并将其放在我的母版页中。

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

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

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

4

6 回答 6

4

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

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

    " %>
于 2009-03-31T08:04:58.600 回答
2

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

就像是:

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

我没试过所以只是一个想法......

于 2009-06-09T19:51:49.030 回答
1

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

如果数据有些静态(例如变化不大的菜单),您还可以做的是将对象放在缓存上,这样就不会在每次控制器初始化时调用您的数据库。

于 2009-03-31T21:03:05.110 回答
1

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

protected override ViewResult View(string viewName, string masterName, object model)
{
    this.ViewData["menu"] = this.PagesRepository.GetPublishPages();
    return base.View(viewName, masterName, model);
}
于 2009-10-20T01:25:01.830 回答
0

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

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

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

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

您的问题是否是某些控制器具有执行和不调用从该特定母版页派生的视图的操作?因此,因此,如果您正在实现一个基本控制器,那么不使用该特定母版页的操作仍将具有它的视图数据......?(如果这一切都说得通的话 ;-)

于 2009-03-31T21:51:00.923 回答
0

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

于 2010-02-14T16:20:25.600 回答