2

我有一个看起来像这样的网址

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

returnUrl = "/Event/Details/41"

我需要从返回 url 获取路由值 - 其中包括 EventID = 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);
   ....
}

但我觉得可能有一种更灵活的方式可以让我访问查询字符串、路由值等,而无需手动这样做。

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

4

3 回答 3

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 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
于 2013-04-09T12:52:37.377 回答
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;
}
于 2013-04-09T13:10:32.697 回答
0

将您的控制器操作更改为这一操作,在模型绑定阶段 ASP.NET MVC 会查看请求并找到的值,returnUrl您不需要手动处理它。

    public ActionResult Login(string returnUrl)
    {
        int EventID = 0;
        int.TryParse(Regex.Match(returnUrl, "[^/]+$").ToString(), out EventID);
        ....
    }
于 2013-04-09T14:27:10.520 回答