我必须在我的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#分开。
答案 0 :(得分:1)
这是一个非常干净的方法,它将使您获得从Web应用程序获得的所有功能,HTML的Visual Studio格式,Razor(基本上是MVC项目中的所有内容):
在下文中,我将假设我们有一个将使用MVC应用程序的控制台应用程序。
配置MVC应用程序的步骤
这些步骤将预编译您的视图。因此,稍后我们将能够直接从控制台应用程序访问视图。
在记事本中打开MVC项目的.csproj
文件并添加以下元素:
1.在最顶层的PropertyGroup
元素中,添加<MvcBuildViews>true</MvcBuildViews>
2.在文件的最后添加:
<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
<AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>
3.建立项目。我们需要确保编译视图。为确保实际编译它,在.cshtml
文件中编写一些不编译的代码。编译时,如果一切设置正确,编译应该失败,表明编译器也在编译视图。如果它没有失败,则上述步骤之一未按规定完成。如果它失败了,那就是好消息。删除错误并重新编译。
配置控制台应用程序的步骤
View in Object Browser
。您的视图将位于ASP
命名空间内。请注意视图的名称。_Views_Test_Index_cshtml
。正如您所看到的,上述大多数步骤都只是设置。
<强>用法强>
我做了一个快速测试,这就是我需要的所有代码:
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有帮助。