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?的主要内容,如果未能解决你的问题,请参考以下文章
Django模拟ASP.NET MVC 自动匹配路由(转载)
如何使用 ASP.NET MVC 5 中的 JavaScript 在运行时使用路由值增加 actionlink?
8.MVC框架开发(URL路由配置和URL路由传参空值处理)