【问题标题】:Extend existing MVC site to pass new data into ViewData for every action扩展现有 MVC 站点,为每个操作将新数据传递到 ViewData
【发布时间】:2010-12-13 23:19:40
【问题描述】:

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

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

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

非常感谢任何想法!

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-2


    【解决方案1】:

    您可以编写自定义操作过滤器属性并将此属性应用于基本控制器或需要注入此信息的所有操作:

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

    然后用这个属性装饰你的基本控制器:

    [AdditionalViewDataInjector]
    public class BaseController: Controller { }
    

    在 ASP.NET MVC 3 中有一个 global action filters 的概念,因此您甚至不需要拥有基本控制器或使用此过滤器装饰您的所有操作。有一个workaround allowing you to achieve the same in ASP.NET MVC 2。现在,您的所有视图都在视图数据中获得了这个附加属性。

    话虽如此,前一个是一个丑陋的解决方法,而不是我推荐的东西(ViewData 是丑陋的)。你可以看看Html.Action and Html.RenderAction helpers。以下是它的外观:

    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") %>
    

    【讨论】:

    • Genius - 后一种使用子动作的解决方案绝对完美,并且非常适合网站已经堆叠的方式。我将数据作为操作方法参数,它使用自定义模型绑定器(与 cookie 和查询字符串交互),然后触发内容的部分视图,只需将绑定对象作为模型传递。主然后只使用一行 Html.RenderAction() 现在它适用于所有页面。谢谢:)
    【解决方案2】:

    在您的基本控制器中覆盖 OnResultExecuting 并将所需数据添加到 ViewData 属性..

    public override void OnResultExecuting(ResultExecutingContext ctx) {
        ViewData["title"] = "Hello world!";
        base.OnResultExecuting(ctx);
    }
    

    【讨论】:

      猜你喜欢
      • 2016-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-22
      • 2021-04-08
      • 2017-02-06
      • 1970-01-01
      相关资源
      最近更新 更多