如何找到从哪里动作路由到ASP.NET MVC?
我不认为标题有任何意义,所以我希望我可以解释得很好。如何找到从哪里动作路由到ASP.NET MVC?
我有控制项与行动EditItem。 EditItem从很多地方路由到,如
/Item/Browse/ByCategory
/Item/Browse/ByType
/Item/Browse/ByWhatever
我真正喜欢的是用户从他点击某个项目编辑返回页面。
我知道我可以通过传递为EditItem操作的?RETURNURL参数做到这一点,但我一直想知道,是否有可能从那里确实从用户,像引荐来到发现...
刚刚创建的测试解决方案,所以我敢肯定,这将工作。 1)默认一个之前创建新的路径:
routes.MapRoute("EditItem",
"EditItem/{referrer}/{id}",
new {controller = "Item", action = "EditItem",id = "",referrer = "ByCategory"}
);
2)使用此链接EditItem您的任何3次:
<%= Html.RouteLink("Edit Item 1", "EditItem",
new {referrer = ViewContext.RouteData.Values["action"], id = 1}) %>
3)在EditItem视图使用此后退按钮:
<%= Html.RouteLink("Back", "Default",
new { action = ViewContext.RouteData.Values["referrer"]})%>
使用路由可以使URL更加美观且用户友好。
有除了传递returnUrl或检查HttpContext.Current.Request.Referer
属性外没有其他方法。但Referer
给你需要解析的字符串值来提取Action。
啊,但当然一切皆有可能。在您的控制器(或最好是基本控制器)中重写OnActionExecuted和OnActionExecuting,并将您先前的URL放入会话中。在任何使用此实现的控制器继承的控制器中使用会话变量(如果您不从自定义基础继承,则使用此控制器)。
protected string NextBackUrl {get; set;}
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
HttpContext.Current.Session["PreviousURL"] = NextBackUrl;
base.OnActionExecuted(filterContext);
}
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (Request.Url != null && Request.UrlReferrer != null && Request.Url != Request.UrlReferrer)
{
NextBackUrl = Request.UrlReferrer.AbsoluteUri;
}
base.OnActionExecuting(filterContext);
}
非常优雅的解决方案,谢谢! – Vnuk 2010-02-18 17:35:29
会话可能会过期,您将丢失页面地址信息。 – 2010-02-18 19:10:26
+1为第一:) – Vnuk 2010-02-18 17:36:42
ReferrerUrl可能无法在某些环境中工作。例如,如果像IE这样的浏览器具有强大的安全选项,而不是将此信息发送到服务器。这在这种情况下不起作用。 另外,使用HTTPS也可能不会在服务器上发送此信息。 – 2010-02-18 19:12:44