从部分视图生成URL时,RouteUrl为null

时间:2015-04-18 14:54:49

标签: c# asp.net-mvc razor

我有一个分页搜索结果集,它是在局部视图中生成的。

为了生成分页链接,我使用此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上下文有关,但我现在感到很茫然。任何反馈欢迎。

2 个答案:

答案 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而不使用现在的。