生成<a> link in controller to send in email</a>

时间:2013-04-19 11:41:06

标签: html asp.net-mvc-4 hyperlink asp.net-core-2.0 asp.net-mvc-routing

我正在实施一个密码重置系统,虽然代码工作正常,但是用户有一个小问题。该系统通过生成通过电子邮件发送的一次性加密安全令牌来工作。问题是,要使用这些令牌,用户必须单击他们收到的电子邮件中的链接。这本身不是问题,但有问题的链接看起来像这样:

http://www.example.com/Account/ResetPassword/184?t=BC2EveZtRl3wjbONboalzlUVwUpp%252BYaiKvbsZ6aPPYE%253D

用户不愿意点击此链接,因为它很大且看起来很吓人;他们认为这是一个恶意的第三方窃取他们的密码或给他们一个病毒或什么的伎俩。

如果这是一个视图,我会使用@Html.ActionLink()生成一个漂亮的<a>链接,上面写着“点击此处重置您的密码”,这样就可以了。但是,在控制器中,我无法访问该方法,除非我实例化HtmlHelper,这需要ViewData,这导致需要实例化的整个链条以伪造一些我不会用的东西,而且我看过的每个地方都说这是不好的做法,我不应该这样做。

在ASP.NET MVC中,在控制器代码中生成简洁<a>链接的最简洁方法是什么?

2 个答案:

答案 0 :(得分:5)

UrlHelper在控制器中通过Url属性可用,它可以做同样的事情,那就是为你构建一个URL。因此,您可以向电子邮件发件人提供包含链接的文本,这就是您构建电子邮件部分的方式:

var link = "<a href='http://www.mysite.com/" 
    + @Url.Action("ResetPassword","Account", new{id=184, t=token}) 
    +"'>Click here to reset your password</a>"
// where token is your single-use crypto-secure

如果您希望域名是动态的,则可以将其更改为:

var link = "<a href='" 
    + Request.Url.Scheme + "://"
    + Request.Url.Authority
    + @Url.Action("ResetPassword","Account", new{id=184, t=token}) 
    +"'>Click here to reset your password</a>"
// where token is your single-use crypto-secure

答案 1 :(得分:0)

如果您使用的是Asp.NET Core 2.0或更高版本,则可以使用Url.Page()方法来生成链接。

var link = Url.Page("/Account/ResetPassword", new{id=184, t=token}, Request.Scheme);