Создание URL-адреса в контроллере .NET MVC

131

Мне нужно создать ссылку в действии на контроллере, чтобы отправить электронное письмо. Что для этого лучше всего? Сам не хочу конструировать на случай, если маршруты поменяются.

Должен ли я иметь представление для каждого электронного письма, отображать его и отправлять? Это может быть хорошим способом сделать это.

ScottBelchak
источник

Ответы:

231

Если вы просто хотите получить путь к определенному действию, используйте UrlHelper:

UrlHelper u = new UrlHelper(this.ControllerContext.RequestContext);
string url = u.Action("About", "Home", null);

если вы хотите создать гиперссылку:

string link = HtmlHelper.GenerateLink(this.ControllerContext.RequestContext, System.Web.Routing.RouteTable.Routes, "My link", "Root", "About", "Home", null, null);

Intellisense даст вам значение каждого из параметров.


Обновление из комментариев : у контроллера уже есть UrlHelper:

string url = this.Url.Action("About", "Home", null); 
Гидон
источник
17
Последующие действия: для предпоследнего параметра (RouteValueDictionary) приведен пример: new System.Web.Routing.RouteValueDictionary (new {id = 1})
Мэтью М.
15
Вам не нужно создавать новый UrlHelper; на контроллере есть свойство .Url, которое предоставит вам один с правильным RequestContext.
Tobias J
Откуда "рут"? Если мне нужно жестко указать имя маршрута, который я пытаюсь сопоставить, почему бы просто не закодировать URL-адрес?
xr280xr
@ xr280xr: Я считаю, что в этом примере «Root» - это имя маршрута, как определено в методе RegisterRoutes (обычно в RouteConfig). Для меня это было «По умолчанию» (как было, когда я создавал свой проект).
Энди
3
Вам не нужно создавать новый UrlHelper, просто получите доступ к свойству Url в классе Controller.
Джей Дуглас
22

Если вам нужен полный URL-адрес (например, для отправки по электронной почте), рассмотрите возможность использования одного из следующих встроенных методов:

Таким образом, вы создаете маршрут, который будет использоваться для создания URL:

Url.RouteUrl("OpinionByCompany", new RouteValueDictionary(new{cid=newop.CompanyID,oid=newop.ID}), HttpContext.Request.Url.Scheme, HttpContext.Request.Url.Authority)

Здесь URL-адрес создается после того, как движок маршрута определяет правильный:

Url.Action("Detail","Opinion",new RouteValueDictionary(new{cid=newop.CompanyID,oid=newop.ID}),HttpContext.Request.Url.Scheme, HttpContext.Request.Url.Authority)

В обоих методах последние 2 параметра определяют протокол и имя хоста.

С уважением.

andresfiuba
источник
7
К вашему сведению, использование Url.Action(action, controller, routevalue, protocol)также создает полный URL-адрес, поэтому вам не нужно указывать имя хоста, если вам не нужно.
Энди Тьяджоно 09
1
Я получаю следующий URL с удвоенным номером порта, как мне это исправить, пожалуйста? http: // localhost: 54383: 54383 / MyArea / MyController / Details / 1
Patee Gutee
12

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

Мое решение выглядит так:

string link = HttpContext.Request.Url.Scheme + "://" + HttpContext.Request.Url.Authority + Url.Action("ResetPassword", "Account", new { key = randomString });

Таким образом создается полный URL-адрес, и он работает, даже если приложение находится на нескольких уровнях на сервере хостинга и использует порт, отличный от 80.

РЕДАКТИРОВАТЬ: Я тоже нашел это полезным.

Моше
источник
Обратите внимание, что это серьезная уязвимость системы безопасности. Все, что потребуется, - это изменить заголовок запроса, чтобы он содержал вредоносный URL-адрес в качестве хоста, и ваше приложение отправит официальное электронное письмо, содержащее ссылку на опасный веб-сайт.
V0ldek 02
7

Другой способ создать абсолютный URL-адрес действия:

var relativeUrl = Url.Action("MyAction");  //..or one of the other .Action() overloads
var currentUrl = Request.Url;

var absoluteUrl = new System.Uri(currentUrl, relativeUrl);
Sphinxxx
источник
4

Я знаю, что это старый вопрос, но на всякий случай, если вы пытаетесь сделать то же самое в ASP.NET Core, вот как вы можете создать UrlHelper внутри действия:

var urlHelper = new UrlHelper(this.ControllerContext);

Или вы можете просто использовать Controller.Urlсвойство, если наследуете от Controller.

Даррен
источник