我有一个看起来像这样的网址
http://mysite/account/login?returnurl=/Event/Details/41
和returnUrl = "/Event/Details/41"
我需要从return 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和blah blah,只是寻找与MVC相关的解决方案或更简单的东西。
答案 0 :(得分: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 :(得分: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;
}
答案 2 :(得分:0)
在模型绑定阶段将控制器操作更改为此操作ASP.NET MVC查看请求并查找returnUrl
的值,您无需手动处理它。
public ActionResult Login(string returnUrl)
{
int EventID = 0;
int.TryParse(Regex.Match(returnUrl, "[^/]+$").ToString(), out EventID);
....
}