我有一个网页,显示用户可以编辑的表格。编辑完成后,我想将表保存为.html文件,以后我可以将其转换为图像。我通过覆盖render方法来做到这一点。但是,我想从最终版本中删除两个按钮和一个DropDownList,这样我就可以自己获取表格了。这是我目前正在尝试的代码:
protected override void Render(HtmlTextWriter writer)
{
using (HtmlTextWriter htmlwriter = new HtmlTextWriter(new StringWriter()))
{
base.Render(htmlwriter);
string renderedContent = htmlwriter.InnerWriter.ToString();
string output = renderedContent.Replace(@"<input type=""submit"" name=""viewReport"" value=""View Report"" id=""viewReport"" />", "");
output = output.Replace(@"<input type=""submit"" name=""redoEdits"" value=""Redo Edits"" id=""redoEdits"" />", "");
var doc = new HtmlDocument();
doc.LoadHtml(output);
var query = doc.DocumentNode.Descendants("select");
foreach (var item in query.ToList())
{
var newNodeStr = "<div></div>";
var newNode = HtmlNode.CreateNode(newNodeStr);
item.ParentNode.ReplaceChild(newNode, item);
}
File.WriteAllText(currDir + "\\outputFile.html", output);
writer.Write(renderedContent);
}
}
我在另一个SO post中使用HtmlAgilityPack替换节点的情况下调整了此解决方案:
var htmlStr = "<b>bold_one</b><strong>strong</strong><b>bold_two</b>";
var doc = new HtmlDocument();
doc.LoadHtml(htmlStr);
var query = doc.DocumentNode.Descendants("b");
foreach (var item in query.ToList())
{
var newNodeStr = "<foo>bar</foo>";
var newNode = HtmlNode.CreateNode(newNodeStr);
item.ParentNode.ReplaceChild(newNode, item);
}
这是我试图改变的呈现HTML:
<select name="Archives" onchange="javascript:setTimeout('__doPostBack(\'Archives\',\'\')', 0)" id="Archives" style="width:200px;">
<option selected="selected" value="Dashboard_Jul-2012">Dashboard_Jul-2012</option>
<option value="Dashboard_Jun-2012">Dashboard_Jun-2012</option>
</select>
对Replace的两次调用正在按预期工作并删除按钮。不过这一行:
var query = doc.DocumentNode.Descendants("select");
抛出此错误:
Method not found: 'Int32 System.Environment.get_CurrentManagedThreadId()'.
感谢任何建议。
问候。
答案 0 :(得分:2)
似乎您在针对.Net或更低版本的项目中使用.Net 4.5版本的Agility Pack,您只需要将Dll的引用更改为为Framework版本编译的引用或将项目更改为.Net 4.5(如果您使用的是VS 2012)。