【问题标题】:Passing a ViewBag/ViewData on each page在每个页面上传递一个 ViewBag/ViewData
【发布时间】:2019-10-10 21:36:28
【问题描述】:

我有一个非常大的 asp.NET MVC 应用程序,我正在寻找最有效的方法来为每个视图添加帮助文档。所以本质上,我在布局内部添加了一个局部视图;在每个页面上都会调用它,它会调用帮助器方法来返回一个字符串,并且该字符串只是该特定页面的帮助文档的 URL。

这是一种方法:

{Key: "User_Management",      Value: "/Account/User/List"},
{Key: "User_Management_Edit", Value: "/Account/User/Edit"}

密钥将是我正在寻找的 URL 的一部分,而值将是返回的 URL 字符串。 因此,如果 URL 是 /User/Management/,那么返回的值将是列表的第一个,/Account/User/List

第二种方法可能是将 keyUser_Management 作为 ViewBag 或 ViewData 直接存储到视图中,然后检查帮助程序中的值。

我唯一担心的是,对于方法一,我必须维护密钥以确保它们与 URL 匹配,而对于方法二,我想知道在每个视图上将字符串作为 viewbag 传递是否效率低下。

很想听听一些替代方案,或者如果有人有更好的主意。

【问题讨论】:

  • 每个页面都有自己的帮助文档 URL,还是所有页面都使用相同的帮助 URL?如何在列表中查找/User/Management/ URL,对应的key是:User_Management?我建议集中精力写一个明确的问题,看看:xy problem
  • 是的,每个页面都有自己的帮助文档 URL。我通过获取 URL 的第一部分来查找列表中的 URL; User 在这种情况下,然后我将它与键的第一部分匹配,使用每个下划线作为分隔符。

标签: c# asp.net-mvc model-view-controller design-patterns


【解决方案1】:

另一种选择,无论好坏……

过滤器呢?您可以创建以下过滤器并明确设置每个操作的帮助文档 url。过滤器会负责将它放在同一个 viewbag 键中,这样您就不必每次都输入它并冒着输入错误的风险。

public class HelpDocumentActionFilter : ActionFilterAttribute
{
    string helpDocUrl { get; set; }

    public HelpDocumentActionFilter(string _url)
    {
        helpDocUrl = _url;
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        //whatever viewbag key you wanted with an opportunity to hit the DB or transform the argument
        filterContext.Controller.ViewBag.HelpUrl = helpDocUrl;
    }

}

用法

 [HelpDocumentActionFilter("/help/doc2")]
    public ActionResult Index()
    {
        ViewBag.Title = "Home Page";

        return View();
    }

【讨论】:

  • 很好,我没有想到这个,当然可以,谢谢你的想法!
猜你喜欢
  • 2011-11-23
  • 1970-01-01
  • 1970-01-01
  • 2011-12-21
  • 2011-04-26
  • 2014-03-19
  • 1970-01-01
  • 1970-01-01
  • 2011-11-19
相关资源
最近更新 更多