You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改基控制器代码,以视图为内容发送HTML邮件

嘿,我来帮你搞定这个把视图转成邮件内容的问题!你已经在基控制器里写了处理视图的代码,其实只需要调整一下逻辑,把视图渲染成HTML字符串,再把这个字符串塞进邮件里就行~

核心思路

本质上就是把原本用来返回给浏览器的视图,先渲染成HTML字符串,然后把这个字符串作为邮件的正文内容发送,而不是直接输出到HTTP响应里。下面以ASP.NET MVC/.NET Core为例,给你具体的实现步骤:

1. 在基控制器中添加视图转字符串的方法

你可以给基控制器扩展一个方法,用来替代原本直接返回视图的逻辑,把视图渲染成字符串:

如果你用的是ASP.NET MVC(.NET Framework)

protected async Task<string> RenderViewToStringAsync(string viewName, object model)
{
    // 把模型绑定到视图数据
    ViewData.Model = model;
    
    using (var stringWriter = new StringWriter())
    {
        // 找到指定的视图
        var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
        var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, stringWriter);
        
        // 渲染视图到StringWriter
        await viewResult.View.RenderAsync(viewContext);
        
        // 返回最终的HTML字符串
        return stringWriter.GetStringBuilder().ToString();
    }
}

如果你用的是.NET Core/.NET 5+

需要先注入相关依赖,再实现渲染逻辑:

// 先在基控制器的构造函数注入依赖
private readonly IRazorViewEngine _razorViewEngine;
private readonly ITempDataProvider _tempDataProvider;
private readonly IServiceProvider _serviceProvider;

public BaseController(IRazorViewEngine razorViewEngine, ITempDataProvider tempDataProvider, IServiceProvider serviceProvider)
{
    _razorViewEngine = razorViewEngine;
    _tempDataProvider = tempDataProvider;
    _serviceProvider = serviceProvider;
}

protected async Task<string> RenderViewToStringAsync(string viewName, object model)
{
    var actionContext = new ActionContext(HttpContext, RouteData, ControllerContext.ActionDescriptor);
    
    using (var stringWriter = new StringWriter())
    {
        // 查找指定视图
        var viewResult = _razorViewEngine.FindView(actionContext, viewName, false);
        
        if (viewResult.View == null)
        {
            throw new ArgumentNullException($"找不到视图:{viewName}");
        }
        
        // 绑定模型到视图数据
        var viewData = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary())
        {
            Model = model
        };
        
        // 构建视图上下文并渲染
        var viewContext = new ViewContext(
            actionContext,
            viewResult.View,
            viewData,
            new TempDataDictionary(HttpContext, _tempDataProvider),
            stringWriter,
            new HtmlHelperOptions()
        );
        
        await viewResult.View.RenderAsync(viewContext);
        
        return stringWriter.ToString();
    }
}

2. 调用方法生成邮件内容并发送

现在你可以在需要发邮件的地方,调用上面的方法渲染视图,再把HTML字符串作为邮件正文发送:

public async Task<IActionResult> SendNotificationEmail()
{
    // 准备视图需要的模型数据
    var emailModel = new EmailContentModel
    {
        UserName = "小明",
        NotificationContent = "你的订单已发货,请留意查收!",
        OrderNumber = "20240520001"
    };
    
    // 渲染指定视图为HTML字符串(比如你的邮件模板视图叫OrderNotification)
    string emailBody = await RenderViewToStringAsync("OrderNotification", emailModel);
    
    // 接下来是发送邮件的逻辑,这里以SmtpClient为例(根据你用的邮件库调整)
    using (var smtpClient = new SmtpClient("smtp.yourdomain.com", 587))
    {
        smtpClient.Credentials = new NetworkCredential("your-email@yourdomain.com", "your-email-password");
        smtpClient.EnableSsl = true;
        
        var mailMessage = new MailMessage
        {
            From = new MailAddress("your-email@yourdomain.com"),
            Subject = "订单发货通知",
            Body = emailBody,
            IsBodyHtml = true // 必须设置为true,否则邮件会显示纯文本HTML代码
        };
        mailMessage.To.Add("user@example.com");
        
        await smtpClient.SendMailAsync(mailMessage);
    }
    
    return Ok("邮件发送成功");
}

3. 几个关键注意事项

  • 邮件样式尽量用内联CSS:大部分邮件客户端不支持外部CSS文件或者
相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:10:17