在不是子动作的控制器中更改ViewBag,并在View上下文中检索它

本文关键字:并在 ViewBag View 上下文 检索 控制器 | 更新日期: 2023-09-27 18:07:58

我们的应用程序有一个全局控制器,所有其他控制器都继承它;从内部,在OnResultExecuting覆盖中,我访问存储在

中的项(通过访问Session, HttpContext和Web.config获得的内容)。

filterContext.ParentActionViewContext.ViewBag

,这允许我在请求生命周期的后期访问ViewBag中的这个项目。

PROBLEM:其中一些filterContext不是子动作,因此他们的ParentActionViewContext字段是空的,我不知道有任何其他方式访问ViewBag。

QUESTION:如果我的控制器偶然发现了一个非子Action,我怎么能把这个项目传递给ViewBag?

我想强调一下我在ASP方面缺乏经验。Net MVC4 -如果有更好的方法来解决这个问题,请不要犹豫,建议它。

编辑:添加一些代码来澄清。

这是我保存myItem在ViewBag在我的控制器方法:

protected override void OnResultExecuting(ResultExecutingContext filterContext) {
    [...]
    if (filterContext.ParentActionViewContext != null && filterContext.ParentActionViewContext.ViewBag != null) {
        filterContext.ParentActionViewContext.ViewBag["DealerId"] = myItem;
    }
    [...]
    base.OnResultExecuting(filterContext);
}

这是我在HtmlHelper中检索它的地方:

public static MvcHtmlString DealerSpecificLessStyleSheet(this HtmlHelper htmlHelper)
    {
        var linkBuilder = new TagBuilder("link");
        var dealerReferenceGuid = (string)htmlHelper.ViewBag["DealerId"];
        /* Do something with this ID */
        [...]
        return new MvcHtmlString(linkBuilder.ToString());
    }

在不是子动作的控制器中更改ViewBag,并在View上下文中检索它

我访问一个项目(通过访问Session获得的东西…

如果你已经在Session中有了这个值,那么你不需要在ViewBag中有它,只是在你当前的情况下。您可以使用helper类将其获取到视图中:

public sealed class UIHelper
{
    public static string GetThatValue()
    {
        return (string)HttpContext.Current.Session["target_key"];
    }
}