在C#中生成HTML页面 - 最佳实践

时间:2018-06-09 13:42:20

标签: c# html

我必须在我的C#代码中生成一个大的html页面(它不是一个网站,只是一个大的单页html报告)

页面包含在一个页面中编译的不同部分。每个部分都包含CSS样式,javascript部分和与之相关的主体。 CSS样式是静态部分,脚本和&使用不同的输入数据(csv文本)生成正文部分。

我的第一个简化一体化的无艺术解决方案是创建一个构建器函数:

 private static string BuildHtmlPage(string[] cssParts, string[] scriptParts, string[] bodyParts)
    {
        var htmlPage = "";
        htmlPage += @"<!DOCTYPE HTML>
 <html>";

htmlPage += "\n<head>";

        htmlPage += "\n<style>\n";
            foreach (var cssPart in cssParts)
            {
                htmlPage += cssPart +"\n";
            }
        htmlPage += "</style>\n";

        htmlPage += @"<script type=""text/javascript"">";
        htmlPage += "window.onload = function() {";

            foreach (var scriptPart in scriptParts)
            {
                htmlPage += scriptPart + "\n";
            }

        htmlPage += @"}
</script>";

htmlPage += "\n</head>";

        htmlPage += "\n<body>\n";
            foreach (var bodyPart in bodyParts)
            {
                htmlPage += bodyPart + "\n";
            }
        htmlPage += "\n</body>";

htmlPage += "\n</html>";

return htmlPage;

    }

然后生成一个“小”html部分并像这样使用它:

var htmlResult = BuildHtmlPage(
            new [] {style1, style2 },
            new [] {script1, script2, script3 },
            new [] {body1, body2, body3 }
        );

它使我的代码更清晰,但由于大量的html代码混合到C#代码中,它仍然看起来很丑陋且难以维护。

你能提出什么想法来处理这样的任务?首先,我的意思是将html代码与C#分开。

1 个答案:

答案 0 :(得分:1)

这是一个非常干净的方法,它将使您获得从Web应用程序获得的所有功能,HTML的Visual Studio格式,Razor(基本上是MVC项目中的所有内容):

  1. 创建一个ASP.NET MVC项目。
  2. 创建视图,就像创建MVC视图一样。
  3. 一旦您对外观感到满意,然后创建另一个应用程序(控制台,Windows窗体等)并从中引用MVC应用程序。
  4. 控制台应用程序可以从MVC应用程序获取视图,而不是使用浏览器。
  5. 在下文中,我将假设我们有一个将使用MVC应用程序的控制台应用程序。

    配置MVC应用程序的步骤

    这些步骤将预编译您的视图。因此,稍后我们将能够直接从控制台应用程序访问视图。

    1. 右键单击您的MVC项目并添加这些NuGet包:
      1. RazorGenerator.MsBuild
      2. RazorGenerator.Mvc
    2. 在记事本中打开MVC项目的.csproj文件并添加以下元素:

      1.在最顶层的PropertyGroup元素中,添加<MvcBuildViews>true</MvcBuildViews>

      2.在文件的最后添加:

      <Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
          <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
      </Target>
      

      3.建立项目。我们需要确保编译视图。为确保实际编译它,在.cshtml文件中编写一些不编译的代码。编译时,如果一切设置正确,编译应该失败,表明编译器也在编译视图。如果它没有失败,则上述步骤之一未按规定完成。如果它失败了,那就是好消息。删除错误并重新编译。

    3. 配置控制台应用程序的步骤

      1. 右键单击该项目并添加RazorGenerator.Testing。即使我们没有测试,我们也会使用这个库来生成视图的HTML。
      2. 添加对MVC应用程序的引用,就像引用DLL一样。
      3. 右键单击MVC项目参考,然后从上下文菜单中选择View in Object Browser。您的视图将位于ASP命名空间内。请注意视图的名称。
      4. 创建一个视图实例,如下面的 Usage 所示,您就完成了。例如,我的视图名称为_Views_Test_Index_cshtml
      5. 正如您所看到的,上述大多数步骤都只是设置。

        <强>用法

        我做了一个快速测试,这就是我需要的所有代码:

        var view = new ASP._Views_Test_Index_cshtml();
        view.ViewBag.Model = new List<string>() { "One", "Two", "Three" };
        var html = view.RenderAsHtml();
        

        由于View.Model是只读的,我使用ViewBag.Model来设置视图的模型。以下是观点:

        @{
            ViewBag.Title = "Index";
            var MyModel = this.ViewBag.Model as List<string>;
        }
        
        @for (int i = 0; i < MyModel.Count ; i++)
        {
            <label>@MyModel[i]</label>
        }
        

        这是生成的HTML:

        <label>One</label>
        <label>Two</label>
        <label>Three</label>
        

        您可以将ViewBag中所需的任何内容传递给您的视图。您可能会发现this article有帮助。