Asp.net mvc 3 如何将Request.QueryString传递给Url.Action?
我正在使用以下方法构建url:Asp.net mvc 3 如何将Request.QueryString传递给Url.Action?,asp.net-mvc-3,Asp.net Mvc 3,我正在使用以下方法构建url: Url.Action("action", "controller"); 我还希望将当前请求的查询字符串传递到该url中。 类似于以下内容(但不起作用): 通过以下扩展,可以将QueryString转换为RouteValue: public static RouteValueDictionary ToRouteValues(this NameValueCollection queryString) { if (queryString
Url.Action("action", "controller");
我还希望将当前请求的查询字符串传递到该url中。
类似于以下内容(但不起作用):
通过以下扩展,可以将QueryString转换为RouteValue:
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扩展方法似乎是正确的,而且是正确的方法。如果您希望能够轻松地向Url添加其他路由值参数。操作,请尝试此扩展方法(基于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 }));
以下是基于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;
}
}
控制器中的用法(例如编辑操作):
在视图中生成的编辑表单(使用模式对话框):
如果查询字符串包含两个具有相同键的键/值,这将引发异常,因为有人可以在浏览器中更改查询字符串。谢谢,这个问题是一个非常有用的答案!什么是
querystring.IsNull()
?是自定义扩展吗?因为我在任何地方都看不到它。第一行可以缩短为var values=newroutevaluedictionary(obj)代码>。由于RouteValueDictionary(object)
接受空值(它实例化一个空字典),因此三元值是不必要的。您还可以将obj
参数设置为可选参数,如下所示:ToRouteValues(this NameValueCollection col,object obj=null)
。然后,如果只想将查询字符串作为路由数据发送,则可以使用不带参数的ToRouteValues()
。
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;
}
}
[HttpPost]
public ActionResult Edit(MyModel model)
{
// Some stuff
return RedirectToAction("Index", Request.QueryString.ToRouteValues());
}
@using (Html.BeginForm("Edit", "SomeControllerName", Request.QueryString.ToRouteValues(), FormMethod.Post))
{
// Some stuff... e.g. dialog content
}