我正在使用以下方法构建网址:
Url.Action("action", "controller");
我也喜欢将当前请求的查询字符串传递给该URL。 像下面的东西(但它不起作用):
Url.Action("action", "controller", Request.QueryString);
使用以下扩展名可以将QueryString转换为routevalues:
public static RouteValueDictionary ToRouteValues(this NameValueCollection queryString)
{
if (queryString.IsNull() || queryString.HasKeys() == false) return new RouteValueDictionary();
var routeValues = new RouteValueDictionary();
foreach (string key in queryString.AllKeys)
routeValues.Add(key, queryString[key]);
return routeValues;
}
使用扩展方法,以下工作正常:
Url.Action("action", "controller", Request.QueryString.ToRouteValues());
还有其他更好的方法吗? THX
答案 0 :(得分:33)
如果您希望能够轻松地将其他路由值参数添加到Url.Action,请尝试使用此扩展方法(基于Linefeed),该方法接受匿名对象并返回RouteValueCollection:
public static RouteValueDictionary ToRouteValues(this NameValueCollection col, Object obj)
{
var values = new RouteValueDictionary(obj);
if (col != null)
{
foreach (string key in col)
{
//values passed in object override those already in collection
if (key != null && !values.ContainsKey(key)) values[key] = col[key];
}
}
return values;
}
然后你可以像这样使用它:
Url.Action("action", "controller", Request.QueryString.ToRouteValues(new{ id=0 }));
答案 1 :(得分:14)
扩展方法似乎是正确的,是最佳选择。
答案 2 :(得分:0)
这是我的解决方案,基于pwhe23的答案。 我想通过POST请求(由于Mvc.Grid)保留查询字符串参数,并且只使用一个HTTP GET操作。 CRUD操作由单个页面和模态对话框处理(用于插入/更新/删除)。
所以这是我的扩展名:
public static class MvcExtensions
{
public static RouteValueDictionary ToRouteValues(this NameValueCollection col, Object obj = null)
{
var values = obj != null ? new RouteValueDictionary(obj) : new RouteValueDictionary();
if (col == null) return values;
foreach (string key in col)
{
//values passed in object are already in collection
if (!values.ContainsKey(key)) values[key] = col[key];
}
return values;
}
}
Controller中的用法(例如编辑操作):
[HttpPost]
public ActionResult Edit(MyModel model)
{
// Some stuff
return RedirectToAction("Index", Request.QueryString.ToRouteValues());
}
在View中生成的编辑表单(使用模态对话框):
@using (Html.BeginForm("Edit", "SomeControllerName", Request.QueryString.ToRouteValues(), FormMethod.Post))
{
// Some stuff... e.g. dialog content
}