在底层视图设置后,如何访问ViewBag.Title?

时间:2011-06-02 15:22:31

标签: asp.net-mvc asp.net-mvc-3 viewbag

这就是事情。我有一个MVC Action,在这个动作上,我已经应用了一个自定义ActionFilterAttribute来使反序列化工作。现在,我想要做的是根据在此视图中设置的ViewBag.Title设置一些标题。

我已尝试将ViewResult包装在我自己的中,并覆盖ExecuteResult,但ViewBag始终为空: - (。

这甚至是可能的吗?或者一旦_layout被执行,MVC引擎是否会重置ViewBag?

更新 让我发布一些代码示例,以便更清楚我想做什么。我有一个电子邮件服务,我从MVC视图渲染正文。所以我的观点如下:

@{ViewBag.Title = "EventCreated";}

Something that ressembles an email message here.

现在我有一个Controller,其动作看起来像这样:

 public ActionResult HelloWorld(MailView<HelloWorldMessage> msg)
        {
            Response.Headers["subject"] = "Test subject";

            return View(msg);
        }

我想让Headers [“subject”]语句看起来像Response.Headers [“subject”] = ViewBag.Title;我希望能够让View认为它正在处理一个普通的网页。

我尝试使用ActionFilterAttribute并覆盖OnResultExecuted但无法使其工作。

一种可能的选择是在布局页面上设置它,并根据某些标准决定使用哪种布局。这样我仍然可以保持Reponse的东西远离我的观点,但使它相当干净。你觉得怎么样?

谢谢,  ANZE

1 个答案:

答案 0 :(得分:3)

试试这个 - 分配视图结果的输出

var output = View(msg);
//do your other viewbag stuff here
return output;

为什么所有这一切 - 当你说“并且我想能够让View认为它正在处理普通网页时我没有遵循。”

修改: 你为什么不在视图中通过帮助方法设置它? 翼

@{
   SetTitle("Home Page");
}


@functions {
    public void SetTitle(string title)
    {
        ViewBag.Title = title;
        Response.Headers.Add("title", title);
    }

}