我有一个分页搜索结果集,它是在局部视图中生成的。
为了生成分页链接,我使用此UrlHelper
扩展名来保留当前RouteValues
并仅使用提供的路由值进行合并。
public static string CurrentRouteUrl(this UrlHelper url, string routeName, RouteValueDictionary routeValues)
{
var context = url.RequestContext;
var combinedRouteValues = new RouteValueDictionary(context.RouteData.Values);
var queryString = context.HttpContext.Request.QueryString;
foreach (var key in queryString.AllKeys.Where(key => key != null))
{
combinedRouteValues[key] = queryString[key];
}
if (routeValues != null)
{
foreach (var routeValue in routeValues)
{
combinedRouteValues[routeValue.Key] = routeValue.Value;
}
}
return url.RouteUrl(routeName, combinedRouteValues);
}
用法(示例):
@Url.CurrentRouteUrl("MyRouteName", new RouteValueDictionary { { "Query.Page", 10 } }
但由于某些原因,从部分视图渲染时返回的网址为null
。
如果我使用MVC框架提供的默认Url.RouteUrl(...)
,则url不为null。但是这种方法不保留当前的查询字符串。
我觉得它与我的扩展方法中的url上下文有关,但我现在感到很茫然。任何反馈欢迎。
答案 0 :(得分:0)
你是从控制器调用的吗?你的假设是正确的,你可能没有上下文。尝试仅测试porposes,从控制器调用此方法。
你的电话是这样的:
CurrentRouteUrl(Url, "routeName", "routeValues")
其中Url就像上面传递的Url一样,只需将其传递给类似的方法,它是来自System.Web.Mvc.Controller的属性
最佳
丹尼尔
答案 1 :(得分:0)
我将自己回答这个问题。这一行:
var combinedRouteValues = new RouteValueDictionary(context.RouteData.Values);
我试图在方法签名中覆盖的routeName
,解决方法是从该构造函数中删除context.RouteData.Values
,因为我希望提供routeName
而不使用现在的。