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

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

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

Ответ 1

Если вы просто хотите получить путь к определенному действию, используйте 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); 

Ответ 2

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

С уважением.

Ответ 3

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

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

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

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

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

Ответ 4

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

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

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

Ответ 5

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

var urlHelper = new UrlHelper(this.ControllerContext);

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