C# MVC 5 - Как создать шаблоны электронной почты, используя .cs html? - PullRequest
0 голосов
/ 29 апреля 2020

В C# MVC 5, есть ли какой-нибудь встроенный способ создания шаблонов электронной почты из .cshtml файлов?

Я хотел бы скомпилировать .cshtml на основе модели, которую мы передаем, создав тем самым необработанную строку .html.

Похоже, что компиляция не вызывается в C# MVC. Нам нужен необработанный вывод HTML, потому что мы пытаемся отправлять электронные письма.

Если возможно, избегайте сторонних библиотек в ответах - пытайтесь придерживаться ванили C#.

Что я пробовал

Здесь -строки могут быть возможным решением, но они могут стать грязными и трудными для чтения. Они также не будут показывать ту же линейку IDE, что и файл .cshtml.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2020

Это метод, который я использую, чтобы строго ввести модель в .cs html и заставить Razor отображать html в качестве переменной, которую я могу использовать с телами электронной почты.

public string ProcessView<TModel>(string viewName, object model, ControllerContext controllerContext, ViewDataDictionary viewData, TempDataDictionary tempData)
{
    Check.NullOrEmpty(viewName, "viewName", "View name is required.");
    Check.Null(viewData, "viewData", "It might be nothing, but view data was null and the original .net code has a special case for it.");

    var dictionary = new ViewDataDictionary(viewData)
    {
        Model = model,
    };

    using (var writer = new System.IO.StringWriter())
    {
        var hostView = new RazorView(controllerContext, "nothing", String.Empty, false, Enumerable.Empty<string>());
        var tempContext = new ViewContext(controllerContext, hostView, viewData, tempData, writer);
        var view = FindPartialView(tempContext, viewName);
        var viewContext = new ViewContext(controllerContext, view, dictionary, tempData, writer);
        view.Render(viewContext, writer);

        return writer.ToString();
    }
}

private static IView FindPartialView(ViewContext viewContext, string partialViewName)
{
    var viewEngineCollection = ViewEngines.Engines;
    ViewEngineResult result = viewEngineCollection.FindPartialView(viewContext, partialViewName);
    if (result.View != null)
    {
        return result.View;
    }
    StringBuilder builder = new StringBuilder();
    foreach (string str in result.SearchedLocations)
    {
        builder.AppendLine();
        builder.Append(str);
    }
    throw new InvalidOperationException("Could not find view named:" + partialViewName + " The following locations where checked: " + builder);
}
0 голосов
/ 30 апреля 2020

Абсолютно, вы можете сделать это самостоятельно.

Опции 1 : используйте _partialViews с dynamic model и renderpartial to или опцией рендеринга в HTMLstring @Html.Partial(_PartialView,(ModelClass)View.Data)

Вариант 2 : создайте свой шаблон на основе пользователя / арендатора / выбора на стороне сервера.

Этот пример готовится отправить подтверждение регистрации и внутри комментариев вы можете увидеть, где вы можете переключать / загружать различные HTML temaplates

    // POST: /Account/Register  
    [HttpPost]  
    [AllowAnonymous]  
    [ValidateAntiForgeryToken]  
    public async Task<IActionResult> Register(RegisterViewModel model, string returnUrl = null)  
    {  
        ViewData["ReturnUrl"] = returnUrl;  
        if (ModelState.IsValid)  
        {  
            var user = new ApplicationUser { UserName = model.Email, Email = model.Email };  
            var result = await _userManager.CreateAsync(user, model.Password);  

            // var user = await _userManager.FindByEmailAsync(model.Email);  
            if (result.Succeeded)  
            {  
                // Send an email with this link  
                var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);  
                var callbackUrl = Url.Action(nameof(ConfirmEmail), "Account", new { userId = user.Id, code = code }, protocol: HttpContext.Request.Scheme);  
                //Email from Email Template  
                string Message = "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>";  
               // string body;  

                var webRoot = _env.WebRootPath; //get wwwroot Folder  

                //Get TemplateFile located at wwwroot/Templates/EmailTemplate/Register_EmailTemplate.html  
                var pathToFile = _env.WebRootPath  
                        + Path.DirectorySeparatorChar.ToString()  
                        + "Templates"  
                        + Path.DirectorySeparatorChar.ToString()  
                        + "EmailTemplate"  
                        + Path.DirectorySeparatorChar.ToString()  
                        + "Confirm_Account_Registration.html";  

                var subject = "Confirm Account Registration";  

                var builder = new BodyBuilder();  
                using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile))  
                {  
                    builder.HtmlBody = SourceReader.ReadToEnd();  
                }  
                //{0} : Subject  
                //{1} : DateTime  
                //{2} : Email  
                //{3} : Username  
                //{4} : Password  
                //{5} : Message  
                //{6} : callbackURL  

                string messageBody = string.Format(builder.HtmlBody,   
                    subject,  
                    String.Format("{0:dddd, d MMMM yyyy}", DateTime.Now),  
                    model.Email,   
                    model.Email,   
                    model.Password,   
                    Message,  
                    callbackUrl  
                    );  


                await _emailSender.SendEmailAsync(model.Email, subject, messageBody);  

                ViewData["Message"] = $"Please confirm your account by clicking this link: <a href='{callbackUrl}' class='btn btn-primary'>Confirmation Link</a>";  
                ViewData["MessageValue"] = "1";  

                _logger.LogInformation(3, "User created a new account with password.");  
                return RedirectToLocal(returnUrl);  
            }  
            ViewData["Message"] = $"Error creating user. Please try again later";  
            ViewData["MessageValue"] = "0";  
            AddErrors(result);  
        }  

        // If we got this far, something failed, redisplay form  
        return View(model);  
    }   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...