ASP MVC Postal RazorEngine.Templating.TemplateCompilationException

Я пытаюсь использовать ASP MVC Postal в фоновом задании для отправки электронных писем следующим образом:

    public void CommentCreated(Comment comment, ApplicationUser user)
    {
        var viewsPath = Path.GetFullPath(HostingEnvironment.MapPath(@"~/Views/Emails"));
        var engines = new ViewEngineCollection();
        engines.Add(new FileSystemRazorViewEngine(viewsPath));

        var emailService = new Postal.EmailService(engines);

        var email = new CommentCreatedEmail
        {
            To = user.Email,
            From = ConfigurationManager.AppSettings["SmtpEMailFrom"],
            Subject = "Comment Created"
            Comment = comment,
            User = user

        };

        emailService.Send(email);

    }

Мое мнение CommentCreated.cshtml выглядит следующим образом:

@model MyApp.Models.CommentCreatedEmail
To: @Model.To
From: @Model.From
Subject: @Model.Subject

<p>
<a href="@Url.Action("Details", "Comment", new { id = @Model.Comment.Id }, "http")">@Url.Action("Details", "Comment", new { id = @Model.Comment.Id }, "http")</a>

Но я получаю следующую ошибку:

Exception thrown: 'RazorEngine.Templating.TemplateCompilationException' in RazorEngine.dll
Exception thrown: 'System.Web.HttpCompileException' in System.Web.dll

Любые идеи


person adam78    schedule 22.08.2016    source источник


Ответы (3)


Включите обработку исключений, чтобы поймать и определить, где происходит ошибка.

public void CommentCreated(Comment comment, ApplicationUser user)
{
    try{
        var viewsPath = Path.GetFullPath(HostingEnvironment.MapPath(@"~/Views/Emails"));
        var engines = new ViewEngineCollection();
        engines.Add(new FileSystemRazorViewEngine(viewsPath));

        var emailService = new Postal.EmailService(engines);

        var email = new CommentCreatedEmail
        {
            To = user.Email,
            From = ConfigurationManager.AppSettings["SmtpEMailFrom"],
            Subject = "Comment Created"
            Comment = comment,
            User = user

        };

        emailService.Send(email);
    }
    catch(TemplateCompilationException ex)
    {
        foreach (var compilerError in ex.CompilerErrors)
        {
            Console.WriteLine(string.Format("{0} - {1} - Line {2} Column {3} in {4}", compilerError.ErrorNumber, compilerError.ErrorText, compilerError.Line, compilerError.Column, compilerError.FileName));
        }
    }
}
person timkly    schedule 23.08.2016
comment
проблема заключается в следующей строке: ‹a [email protected](Подробности, Комментарий, новый {id = @Model.Comment.Id}, http)›@Url.Action(Подробности, Комментарий, новый {id = @Model .Comment.Id }, http)‹/a›` Когда я удаляю эту строку, она работает. Таким образом, движок бритвы не кажется полностью функциональным при использовании вне asp.net. - person adam78; 23.08.2016
comment
Я не использовал Postal раньше, но, учитывая, что RazorEngine выполняет преобразование, проблема более чем вероятна из-за того, что RazorEngine не поддерживает функции @Html или @Url. Поэтому вам нужно будет переписать ссылку как <a href="/comment/details/@Model.Comment.Id">link</a> вместо этого. - person timkly; 24.08.2016

Похоже на эту строку:

Subject = "Comment Created"

не хватает запятой (,) после него, не должно ли быть

Subject = "Comment Created",
person Utkarsh Bais    schedule 03.02.2017

Razor Engine имеет некоторые ограничения за пределами мира MVC, поэтому многие вещи, связанные с ним, вообще не будут работать.

Недавно я столкнулся с этой проблемой, и мое «решение» состояло в том, чтобы установить базовый URL-адрес перенаправления внутри конфигурации приложения и объединить его во время выполнения, что-то вроде этого:

var email = new CommentCreatedEmail
    {
        To = user.Email,
        From = ConfigurationManager.AppSettings["SmtpEMailFrom"],
        Subject = "Comment Created"
        Comment = comment,
        User = user
       CommentLink = ConfigurationManager.AppSettings["SiteUrl"] + "Comment/Details/"+comment.Id
    };

И в вашем файле .cshtml:

@model MyApp.Models.CommentCreatedEmail
To: @Model.To
From: @Model.From
Subject: @Model.Subject

<p>
<a href="@Model.CommentLink">Comment</a>

Надеюсь, поможет!

person Eduardo Julião    schedule 19.04.2017