我有一个ASP.NET MVC应用程序,其管理区域处理管理公司及其子实体,例如用户和产品。与子实体关联的默认路由定义如下:
"Admin/Company/{companyID}/{controller}/{id}/{action}"
我想确保在管理区域的任何地方,只要传入路由包含companyID,该值就会自动包含在每个生成的URL中。例如,如果我的“用户编辑”页面具有使用Html.ActionLink("back to list", "Index")
定义的链接,则路由系统将自动从传入路由数据中获取companyID并将其包含在传出路由中,而无需在调用中明确指定ActionLink的。
我认为实现这一目标的方法不止一种,但有一种首选/最佳方式吗?它是否为自定义路由处理程序而尖叫?还有别的吗?
我的目标是在子部分中导航时不会丢失当前的公司上下文,我不想使用会话 - 如果用户在不同的浏览器窗口/标签中打开多个公司,那么会烧我。
提前致谢!
答案 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);
}
}