4

我使用 umbraco 创建了一个工作流,我想做的是:创建一个工作流来获取由 razor 模板 ( umbraco.forms) 创建的 html。

这是模板的位置umbraco.forms

Views\Partials\Forms\Emails 这个模板是我想在调用这个工作流时通过电子邮件发送的。

public class SendMail : WorkflowType
{  
    //Here I get the path where the razor template is
    [Umbraco.Forms.Core.Attributes.Setting("Path to template",
     Description = "Path to template",
     View = "TextField")]
     public string Template{ get; set; }
   public SendMail()
   {

    this.Id = new Guid("ccbeb0d5-adaa-4729-8b4c-4bb439dc0204");
    this.Name = "Send Mail";
    this.Description = "Send Mail";
    this.Icon = "icon-plugin";
    this.Group = "Services";
   }
    //When workflow get called this method is executed 
    public override WorkflowExecutionStatus Execute(Record record, RecordEventArgs e)
   {

      //here I'm trying to get the template converted to string however isn't work
     //  string template = html.Raw(Template).ToString();
   }

}

我试过string template = html.Raw(Template);了,但我无法访问html.Raw("");

我已经尝试过这个解决方案,但似乎record.ParseWithRazorView(filePath);不存在

有一个工作流程可以做一些接近的事情,但似乎我无法重写或访问此代码

在此处输入图像描述

如果您不完全理解我假装的内容,请发表评论,我会用所有详细信息更新问题

4

6 回答 6

4

我最近想发送 html 电子邮件并从剃须刀页面获取 html 内容。我在这方面取得了成功: https ://github.com/aspnet/Entropy/blob/master/samples/Mvc.RenderViewToString/RazorViewToStringRenderer.cs

我还允许您将模型注入到视图中,以便您可以动态更改呈现的 html。

然后你可以这样调用它:

var html = await myRazorViewToStringRenderer.RenderViewToStringAsync("path/to/view.cshtml", myViewModel);
于 2019-09-04T13:47:20.540 回答
1

我尝试使用RazorLight,这是代码片段。

private async Task<string> GetMailBody(string teamplteName, object mailObject)
{
    var engine = new RazorLightEngineBuilder()
      .UseFilesystemProject("root path")
      .UseMemoryCachingProvider()
      .Build();

    string result = await engine.CompileRenderAsync(teamplteName, mailObject);

    return result;
}
于 2019-09-10T09:04:11.980 回答
1

创建此方法:

public string RenderRazorToString(string viewName, object model, ViewDataDictionary viewData = null)
{
    ViewData.Model = model;

    if (viewData != null)
        foreach (KeyValuePair<string, object> item in viewData)
            ViewData.Add(item);

    using (var sw = new System.IO.StringWriter())
    {
        var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
        var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
        viewResult.View.Render(viewContext, sw);
        viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View);
        return sw.GetStringBuilder().ToString();
    }
}

并在您希望将 razor's template 字符串导出的每个地方调用它。

viewName 是您的模板名称。如果模板需要,model 是您的数据。

于 2019-09-11T07:00:19.420 回答
1

在您的代码中创建助手,它将生成您的模板。

@helper TemplateGenerator()
{
//generate your template here
}

然后你可以制作这个代码

public HtmlString getTemplateHtml(HelperResult Template)
{
HtmlString str = Template.ToString(); 
}

在这个例子中,我使用 HtmlString,但你可以尝试使用字符串,不确定结果。

在剃刀中,您应该以某种方式调用您的函数:

@GetTemplateHtml(TemplateGenerator()); 

这对我来说很好。不确定这是最好的解决方案,但我希望它会有所帮助

于 2019-09-11T07:41:49.950 回答
1

看看Postal之类的东西,这允许您使用视图创建和发送电子邮件,您可以将自己的模型等传递到其中。

于 2019-09-25T09:24:48.340 回答
0

我创建了一个视图和一个umbraco 控制器

namespace name.Core.Controllers
{
    public class TemplateController : Umbraco.Web.Mvc.SurfaceController
    {
        public ActionResult Template()
        {

            return View();
        }
   }
}

我将 URL 传递到“pathtoTemplate”

 public static class TemplateHTML
    {
        public static string GetTemplate(string pathtoTemplate)
        {
            using (WebClient client = new WebClient())
            {
                var encodingbody = client.DownloadData(CaminhoTemplate);
                return Encoding.UTF8.GetString(encodingbody);
            }
        }
    }

var body = TemplateHTML.GetTemplate("http://example.com/umbraco/surface/Template/Template")
于 2019-10-05T22:56:51.663 回答