Url.Action с RouteValueDictionary с протоколом

смотрел на это какое-то время, и чувствую, что я просто глуп, хочу получить еще несколько глаз от него.

Мне нужно создать полный URL-адрес (например, http://www.domain.com/controller/action?a=1&b=2), как правило, я просто использую Url.Action, чтобы сделать это без проблем указав протокол:

var url = Url.Action("Action", "Controller", new { a = 1, b = 2 }, "http");

Я начал собирать класс, который возвращает RouteValueDictionary, чтобы эти анонимные объекты исчезли. Однако я не могу заставить его работать вместе с помощником.

var x = Url.Action("Action", "Controller", new RouteValueDictionary(new { a = 1, b = 2 }), "http");
// "http://127.0.0.1/Controller/Action?Count=2&Keys=System.Collections.Generic.Dictionary%602%2BKeyCollection%5BSystem.String%2CSystem.Object%5D&Values=System.Collections.Generic.Dictionary%602%2BValueCollection%5BSystem.String%2CSystem.Object%5D",

var y = Url.Action("Action", "Controller", new { a = 1, b = 2 }, "http");
// "http://127.0.0.1/Controller/Action?a=1&b=2"

Любые указатели, которые приводят к facepalm, очень оценили:)

Update:

Вероятно, лучше всего пояснить, что в приведенном выше примере мне нужно получить переменную 'X', так как RouteValueDictionary создается в другом месте кода. Предположим, что Правило RouteValueDictionary верное.

Я просто не понимаю, почему это работает с анонимным объектом, но тот же объект, завернутый в один и тот же объект, завернутый в RouteValueDictionary, делает хелперный урод.

Ответ 1

Перегрузка, которую вы используете, предполагает тип "объект" для параметра, в котором вы передаете RouteValueDictionary. По какой-то причине это вызывает проблему, возможно, что-то делать с .ToString()? Используйте перегрузку, которая принимает RouteValueDictionary, и это должно работать.

Чтобы проверить это, добавьте аргумент hostName, чтобы выбрать перегрузку, показанную ниже:

Correct overload

ИЗМЕНИТЬ

Вы можете использовать это расширение в своем проекте, чтобы добавить перегрузку, требуемую для Url.Action. Внутри он будет разрешать и добавлять имя узла из запроса.

public static string Action
    (this UrlHelper helper, string action, 
     string controller, RouteValueDictionary routeValues, string protocol)
{
     string hostName = helper.RequestContext.HttpContext.Request.Url.Host;
     return helper.Action(action, controller, routeValues, protocol, hostName);
}

Ответ 2

Интересно, что ваш конкретный пример соответствует подписи метода, который принимает "объект" как свойство, а не RouteValueDictionary. Таким образом, он просто ToString() выводит имя типа, а не правильно сериализует RouteValueDictionary

 var x = Url.Action("Index", "Home", new RouteValueDictionary(new { a = 1, b = 2 }), "http", string.Empty);

Обратите внимание на "string.Empty" в конце.

Этого достаточно, чтобы заставить код использовать другую перегрузку, которая принимает документ RouteValueDictionary и как таковой, правильно сериализуется.

// http://localhost:55110/?a=1&b=2