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