Генерация URL только из данных маршрута - PullRequest
4 голосов
/ 30 декабря 2011

Я пытаюсь сделать что-то простое в ASP.NET MVC:

RouteValuesDictionary routeValues = GetMyRouteData();
var url = new UrlHelper(Html.ViewContext.RequestContext);
return url.RouteUrl(routeValues);

Проблема в том, что независимо от того, что я делаю, URL включает в себя данные маршрута из текущего контекста запроса. Я хочу создать URL на основе ТОЛЬКО значений маршрута от GetMyRouteData().

Спасибо

Ответы [ 3 ]

7 голосов
/ 30 декабря 2011

Проблема в том, что независимо от того, что я делаю, URL включает в себя данные маршрута из текущего контекста запроса

Это по замыслу. Вы должны явно установить значения маршрута, которые присутствовали в исходном запросе и которые вы не хотите в результирующем URL-адресе, равны нулю:

    var routeValues = GetMyRouteData();
    // remove values that you want to exclude from the resulting url
    // by setting their values to null
    routeValues["id"] = null;
    var url = new UrlHelper(Html.ViewContext.RequestContext);
    return url.RouteUrl(routeValues);
2 голосов
/ 12 марта 2013

Это не относится только к ASP.NET MVC, но из-за разрешения маршрута ASP.NET Routing.Точка входа в него - RouteCollection.GetVirtualPath, которая имеет две подписи.

Первая занимает RequestContext и RouteValueDictionary.Это используется для разрешения маршрута по умолчанию, которое использует поиск по шаблону для поиска маршрута.Поиск маршрута включает в себя все токены от RequestContext, а также RouteValueDictionary;другими словами, два набора токенов маршрута объединяются, чтобы сформировать основу для поиска маршрута.Существует особый случай, когда нулевые параметры в RouteValueDictionary удаляют этот параметр из поиска.Однако, если такой параметр с нулевым значением имеет значение в RequestContext, это значение все равно будет отображаться в сгенерированном URL-адресе как значение строки запроса.

Другая подпись дополнительно принимает имя маршрута.Это немного странно, потому что оно изменяет как разрешение маршрута, так и создание строки запроса.Маршруты найдены, очевидно, с использованием разрешения имен.Учитывая, что названный маршрут найден, в сгенерированном URL будут отображаться только токены для тех параметров, которые указаны в шаблоне URL маршрута.

Почему это так?Это интерпретация ASP.NET MVC соглашения об обработке параметров в Ruby on Rails.

Таким образом, разрешение по умолчанию для маршрута и «резервный» токен разрешены.Если вы не хотите, чтобы токены возвращались к RequestContext, (и вы все еще хотите использовать маршрутизацию ASP.NET), вы должны использовать именованное разрешение маршрута.

0 голосов
/ 30 декабря 2011

Это может помочь уточнить.Используйте источник, Люк!

Помощник RouteUrl вызывает этот статический метод для генерации URL:

public static string GenerateUrl(string routeName, string actionName, string controllerName, RouteValueDictionary routeValues, RouteCollection routeCollection, RequestContext requestContext, bool includeImplicitMvcValues) {
        if (routeCollection == null) {
            throw new ArgumentNullException("routeCollection");
        }

        if (requestContext == null) {
            throw new ArgumentNullException("requestContext");
        }

        RouteValueDictionary mergedRouteValues = RouteValuesHelpers.MergeRouteValues(actionName, controllerName, requestContext.RouteData.Values, routeValues, includeImplicitMvcValues);

        VirtualPathData vpd = routeCollection.GetVirtualPathForArea(requestContext, routeName, mergedRouteValues);
        if (vpd == null) {
            return null;
        }

        string modifiedUrl = PathHelpers.GenerateClientUrl(requestContext.HttpContext, vpd.VirtualPath);
        return modifiedUrl;
}

Обратите внимание на строку:

RouteValueDictionary mergedRouteValues = RouteValuesHelpers.MergeRouteValues(actionName, controllerName, requestContext.RouteData.Values, routeValues, includeImplicitMvcValues);

Это слияниев текущем запросе значения контекста под обложками.Таким образом, вы можете создать свой собственный помощник, который просто вызывает этот статический метод и передает пустые коллекции, чтобы избежать слияния текущих значений контекста маршрута. Поэкспериментируйте и отладьте код MVC, и вы сможете увидеть, какие значения вам нужнынуклеозид.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...