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

时间:2010-07-08 17:04:25

标签: asp.net asp.net-mvc url routing routes

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

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

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

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

我的目标是在子部分中导航时不会丢失当前的公司上下文,我不想使用会话 - 如果用户在不同的浏览器窗口/标签中打开多个公司,那么会烧我。

提前致谢!

1 个答案:

答案 0 :(得分:0)

托德,

我在我的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);
    }
}