gpt4 book ai didi

c# - 扩展现有的 MVC 站点,为每个操作将新数据传递到 ViewData

转载 作者:太空宇宙 更新时间:2023-11-03 22:17:44 26 4
gpt4 key购买 nike

我们有一个基于 Asp.Net MVC2 的白标平台。目前该网站有 6 个 Controller ,以及所有核心 View 等,可以使其直接开箱即用。到目前为止,我们已经用它构建了 5 个站点,一切都很棒。

但是,现在我有一个要求,这意味着我需要能够将一条新数据(在 ViewData 字典中就可以)从任何操作传递到所有 View 。此数据从查询字符串中播种,然后从 cookie 中播种。

这样做的主要原因之一是能够根据此数据的值向站点的母版页添加额外的图像。我当然可以很脏,将反序列化代码放在母版页中;但我宁愿找到一种方法来确保它被添加到每个请求的 ViewData 中,不涉及 Controller 继承和操作方法覆盖(!)。

非常感谢任何想法!

最佳答案

您可以编写一个自定义操作过滤器属性并将该属性应用于基本 Controller 或需要注入(inject)此信息的所有操作:

public class AdditionalViewDataInjectorAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
filterContext.Controller.ViewData["foo"] = "bar";
}
}

然后用这个属性装饰你的基础 Controller :

[AdditionalViewDataInjector]
public class BaseController: Controller { }

在 ASP.NET MVC 3 中有一个概念 global action filters这样你甚至不需要有一个基本 Controller 或用这个过滤器装饰你的所有 Action 。有一个 workaround allowing you to achieve the same in ASP.NET MVC 2 .现在,您所有的 View 都在 View 数据中获得了这个额外的属性。

话虽这么说,前一个是一个丑陋的解决方法,而不是我推荐的方法(ViewData 很丑陋)。你可以看看Html.Action and Html.RenderAction helper 。这可能是这样的:

public class MySpecialController: Controller
{
public ActionResult Index()
{
// Here you have access to the request, cookies, session, routes, ...
var someModel = GetSomeModel();
return View(someModel);
}
}

然后有一些强类型部分将包含所需的 HTML (~/Views/MySpecial/Index.ascx),最后将其包含在您的母版页中:

<%= Html.Action("index", "myspecial") %>

关于c# - 扩展现有的 MVC 站点,为每个操作将新数据传递到 ViewData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4430094/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com