如何在邮件中添加链接以仅展示单条记录?附现有代码
实现邮件链接跳转到单条记录详情页的步骤及代码示例
没问题,我来一步步帮你实现这个功能,完全贴合你现有的ASP.NET MVC代码:
步骤1:在控制器中添加接收ID的GET Action
首先,在你的Ticket控制器(假设和EditOneRecord同属一个控制器)里新增一个ViewSingleTicket的GET方法,用来根据ID查询并返回单条记录:
// 假设你的控制器是TicketController [HttpGet] public ActionResult ViewSingleTicket(int id) { using (DBModel db = new DBModel()) { // 根据ID查询对应的Ticket记录(你的主键字段是iNumber,对应tix.iNumber) var ticket = db.Tickets.FirstOrDefault(t => t.iNumber == id); if (ticket == null) { // 如果找不到记录,返回404提示或跳转到首页 return HttpNotFound("Ticket not found"); } // 将记录传递给视图 return View(ticket); } }
注意:如果你的应用启用了身份验证,用户点击邮件链接后会先跳转到登录页,登录成功后会自动跳转回详情页。如果希望未登录用户也能访问这个页面,可以给这个Action加上
[AllowAnonymous]特性。
步骤2:创建单条记录的详情视图
右键点击刚才的ViewSingleTicket方法,选择"添加视图",按以下配置生成:
- 视图名称:
ViewSingleTicket - 模板:详细信息(Details)
- 模型类:Ticket(你的Ticket实体类)
- 数据上下文类:DBModel
生成的视图会自动渲染Ticket的各个字段,你可以根据需求调整样式或删减字段,示例视图大概是这样:
@model YourNamespace.Ticket @{ ViewBag.Title = $"Ticket #{Model.iNumber} Details"; } <h2>Ticket #@Model.iNumber Updated</h2> <div class="ticket-details"> <dl class="dl-horizontal"> <dt>@Html.DisplayNameFor(model => model.vcAssignedTo)</dt> <dd>@Html.DisplayFor(model => model.vcAssignedTo)</dd> <dt>@Html.DisplayNameFor(model => model.dtLastUpdated)</dt> <dd>@Html.DisplayFor(model => model.dtLastUpdated)</dd> <!-- 这里添加你需要展示的其他字段,比如标题、描述等 --> </dl> </div> <p> @Html.ActionLink("Back to All Tickets", "Index") </p>
步骤3:修改邮件内容,生成正确的绝对链接
回到你的EditOneRecord方法,修改邮件Body部分,用Url.Action生成绝对路径(邮件里的链接必须是完整URL,不能用相对路径):
if (userName != tix.vcAssignedTo) { SmtpClient client = new SmtpClient(); MailMessage mailMessage = new MailMessage(); mailMessage.From = new MailAddress("nsantagata@fieldaero.com"); mailMessage.To.Add("nsantagata@fieldaero.com"); mailMessage.Subject = "Your Ticket Has Been Edited"; // 生成完整的绝对链接:指定协议、域名,确保邮件里的链接可直接访问 var ticketUrl = Url.Action( "ViewSingleTicket", "Ticket", new { id = tix.iNumber }, Request.Url.Scheme, Request.Url.Host ); // 构造HTML格式的邮件内容,添加可点击链接 mailMessage.Body = $"Your ticket {tix.iNumber} has been updated. <br><br>Click here to view the details: <a href='{ticketUrl}'>View Ticket #{tix.iNumber}</a>"; // 必须开启HTML支持,否则链接会显示为纯文本 mailMessage.IsBodyHtml = true; client.Send(mailMessage); }
关键说明:
Url.Action的最后两个参数Request.Url.Scheme(http/https)和Request.Url.Host(域名/IP)用来生成跨环境有效的完整URL,不管你的应用部署在测试还是生产环境,链接都能正常工作。
测试验证
- 编辑一条记录,触发邮件发送
- 打开邮件,点击链接,应该会直接跳转到
ViewSingleTicket页面,展示这条被编辑的记录详情
如果遇到登录跳转的问题,用户登录后系统会自动回到详情页(ASP.NET MVC身份验证会保留ReturnUrl)。
内容的提问来源于stack exchange,提问作者N.Sant
相关产品推荐
相关产品推荐

