ASP.NET MVC 路由 - 将入站路由值自动传递给出站 URL?

Posted

技术标签:

【中文标题】ASP.NET MVC 路由 - 将入站路由值自动传递给出站 URL?【英文标题】:ASP.NET MVC Routing - Pass inbound route value to outbound URLs automatically? 【发布时间】:2011-03-13 11:29:48 【问题描述】:

我有一个带有管理区域的 ASP.NET MVC 应用程序,用于处理管理公司及其子实体(例如用户和产品)。与子实体关联的默认路由定义如下:

"Admin/Company/companyID/controller/id/action"

我想确保在管理区域的任何地方,只要传入路由包含 companyID,该值就会自动包含在每个生成的 URL 中。例如,如果我的用户编辑页面有一个使用html.ActionLink("back to list", "Index") 定义的链接,路由系统将自动从传入路由数据中获取 companyID 并将其包含在传出路由中,而无需在对 ActionLink 的调用中明确指定它。

我认为实现这一目标的方法不止一种,但有首选/最佳方法吗?它会为自定义路由处理程序尖叫吗?还有什么?

我的目标是在子部分中导航时不会丢失当前的公司上下文,并且我不想使用 Session - 如果用户在不同的浏览器窗口/选项卡中打开多个公司,那可能会烧伤我。

提前致谢!

【问题讨论】:

【参考方案1】:

托德,

我在我的 MVC 2 应用程序中使用 ActionFilterAttribute 来实现这一点。可能有更好的方法来做到这一点:

[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
sealed class MyContextProviderAttribute : ActionFilterAttribute

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    
        // See if the context is provided so that you can cache it.
        string myContextParam = filterContext.HttpContext.Request["myContextParam"] ;
        if (!string.IsNullOrEmpty(myContextParam))
            filterContext.Controller.TempData["myContextParam"] = myContextParam;
        else
            // Manipulate the action parameters and use the cached value.
            if (filterContext.ActionParameters.Keys.Contains("myContextParam"))
                filterContext.ActionParameters["myContextParam"] = filterContext.Controller.TempData["myContextParam"];
            else
                filterContext.ActionParameters.Add("myContextParam", filterContext.Controller.TempData["myContextParam"]);

        base.OnActionExecuting(filterContext);
    

【讨论】:

感谢您的回复。有趣的解决方案。虽然我没有尝试过,但 TempData 与 Session 相关联,因此我不认为这解决了我对用户在具有不同“上下文”的浏览器选项卡之间来回切换的担忧。虽然我想避免编写一堆替代 UrlHelper 方法(并记住始终使用它们),但这基本上是我最终采取的路径。 托德,TempData 只能在后续请求中存活,所以这应该适合你。我的应用程序还允许人们在不同的选项卡中为不同的人提取报告。见***.com/questions/173159/…

以上是关于ASP.NET MVC 路由 - 将入站路由值自动传递给出站 URL?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC Url.Action 和路由名称值

Django模拟ASP.NET MVC 自动匹配路由(转载)

如何使用 ASP.NET MVC 5 中的 JavaScript 在运行时使用路由值增加 actionlink?

8.MVC框架开发(URL路由配置和URL路由传参空值处理)

为啥在 asp.net mvc 中的公共路由之前先映射特殊路由?

Mandrill 入站电子邮件路由