如何找到从哪里动作路由到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。

+0

+1为第一:) – Vnuk 2010-02-18 17:36:42

+0

ReferrerUrl可能无法在某些环境中工作。例如,如果像IE这样的浏览器具有强大的安全选项,而不是将此信息发送到服务器。这在这种情况下不起作用。 另外,使用HTTPS也可能不会在服务器上发送此信息。 – 2010-02-18 19:12:44

啊,但当然一切皆有可能。在您的控制器(或最好是基本控制器)中重写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); 
     } 
+0

非常优雅的解决方案,谢谢! – Vnuk 2010-02-18 17:35:29

+0

会话可能会过期,您将丢失页面地址信息。 – 2010-02-18 19:10:26