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

100

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

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

Теги:
asp.net-mvc

5 ответов

201
Лучший ответ

Если вы просто хотите получить путь к определенному действию, используйте 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.
Показать ещё 3 комментария
18

Если вам нужен полный 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 параметра определяют протокол и имя хоста.

С уважением.

  • 6
    К вашему сведению, используя Url.Action(action, controller, routevalue, protocol) также выдает полный URL-адрес, поэтому вам не нужно указывать имя хоста, если вам это не нужно.
  • 0
    Я получаю следующий URL с удвоенным номером порта. Как мне это исправить, пожалуйста? HTTP: // локальный: 54383: 54383 / MyArea / MyController / Подробности / 1
10

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

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

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

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

EDIT: я нашел этот полезным.

3

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

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

var absoluteUrl = new System.Uri(currentUrl, relativeUrl);
0

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

var urlHelper = new UrlHelper(this.ControllerContext);

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню