2013-04-09 41 views
2

我有一个网址,看起来像这样获取登录操作方法路由值

http://mysite/account/login?returnurl=/Event/Details/41 

returnUrl = "/Event/Details/41"

我需要从返回的URL获取路线价值观 - 其中包括事件ID = 41

我能够使用这个代码来获取事件ID:

public ActionResult Login() 
{ 
    .... 
    string returnUrl = Request.QueryString["ReturnUrl"]; 
    int lastIndex = returnUrl.LastIndexOf("/") + 1; 
    string strEventID = returnUrl.Substring(lastIndex); 
    int EventID = Int32.Parse(strEventID); 
    .... 
} 

但我觉得可以有一个更灵活的方式,让我访问querystrings,路由值等,而无需手动这样做。

我不想使用WebRequest,WebClient和等等,只是寻找MVC相关的解决方案或更简单的东西。

+2

这应该帮助 - http://stackoverflow.com/questions/1481565/string-url-to-routevaluedictionary – 2013-04-09 12:34:17

+0

由@DmitryKhryukin给出的链路上的解决方案是一个去,并且它仍然有效为MVC3。另外,'action'始终是'controller'键前面的最后一个键。所以如果你的方法中有参数,它们会出现在这两个键之前。 (例如id,arg2,arg3,控制器,动作) – 2013-04-09 13:36:14

+0

我认为上面的链接非常重视我想要做的事情。这里的大多数答案只是重复了我在问题中的含义,但使用了不同的方法。我想要的是解析returnUrl并提取路由值,例如'Id = 4','Action = Details'和'Controller = Event'。如果在那个returnUrl中有一个查询字符串,我应该可以得到它 – codingbiz 2013-04-09 14:41:26

回答

2

为了获得查询字符串,你可以直接把这些在操作签名:

public ActionResult Login(string returnurl) 
{ 
    .... 
    if(!string.IsNullOrWhiteSpace(returnurl)) { 
     int lastIndex = returnurl.LastIndexOf("/") + 1; 
     string strEventID = returnUrl.Substring(lastIndex); 
     int EventID = Int32.Parse(strEventID); 
    } 
    .... 
} 

编辑:

为了从RETURNURL提取路由参数,你可以通过正则表达式来解析它:

Regex regex = new Regex("^/(?<Controller>[^/]*)(/(?<Action>[^/]*)(/(?<id>[^?]*)(\?(?<QueryString>.*))?)?)?$"); 
Match match = regex.Match(returnurl); 

// match.Groups["Controller"].Value is the controller, 
// match.Groups["Action"].Value is the action, 
// match.Groups["id"].Value is the id 
// match.Groups["QueryString"].Value are the other parameters 
+1

@codingbiz:我已经添加了一个示例代码,以解析您在评论中提到的returnurl ... – 2013-04-09 15:25:32

+1

@codingbiz这是正确的和很好的答案,你在你的问题中提到的是你不想使用WebRequest,WebClient和通过这个解决方案,你不需要使用它们。并在编辑中有很好的正则表达式来获得你需要的所有价值。 – 2013-04-09 17:51:19

+0

@SamuelCaillerie出色的工作 – 2013-04-09 17:52:43

1

试试这个:

public ActionResult Login(string returnUrl) 
{ 
    .... 
    var id = this.GetIdInReturnUrl(returnUrl); 
    if (id != null) 
    { 
    } 
    .... 
} 

private int? GetIdInReturnUrl(string returnUrl) 
{ 
    if (!string.IsNullOrWhiteSpace(returnUrl)) 
    { 
     var returnUrlPart = returnUrl.Split('/'); 
     if (returnUrl.Length > 1) 
     { 
      var value = returnUrl[returnUrl.Length - 1]; 
      int numberId; 
      if (Int32.TryParse(value, out numberId)) 
      { 
       return numberId; 
      } 
     } 
    } 

    return (int?)null; 
} 
0

模型绑定阶段ASP.NET MVC中的控制器动作改成这样一个,眺望请求,并找到returnUrl的价值,你并不需要手动处理。

public ActionResult Login(string returnUrl) 
    { 
     int EventID = 0; 
     int.TryParse(Regex.Match(returnUrl, "[^/]+$").ToString(), out EventID); 
     .... 
    }