Мне нужно иметь возможность создать ссылку в 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
.