C# 自动生成的代码需要生成静态类
我决定帮我朋友做一个他正在做的项目。我正试图为他编写一个测试网页,以验证一些新功能,但在我的自动生成代码中,我得到了C# 自动生成的代码需要生成静态类,c#,asp.net,razor,auto-generate,C#,Asp.net,Razor,Auto Generate,我决定帮我朋友做一个他正在做的项目。我正试图为他编写一个测试网页,以验证一些新功能,但在我的自动生成代码中,我得到了 CS1106: Extension method must be defined in a non-generic static class 在index.cshtml中实现代码并不是实现这一点的最佳方法,但我们只是尝试进行概念验证,稍后将进行适当的实现 在我查看的所有地方,他们几乎都说我定义的所有函数都必须在一个静态类中(如错误状态所示)。这不会太糟糕,除非保存我所有函数的类
CS1106: Extension method must be defined in a non-generic static class
在index.cshtml中实现代码并不是实现这一点的最佳方法,但我们只是尝试进行概念验证,稍后将进行适当的实现
在我查看的所有地方,他们几乎都说我定义的所有函数都必须在一个静态类中(如错误状态所示)。这不会太糟糕,除非保存我所有函数的类是自动生成的,而不是静态的。我不确定我可以更改哪些设置来修复此问题
这是代码的相关部分(我相信)的副本。部分或全部功能的实现可能不正确。我还没有测试过
@{
HttpRequest req = System.Web.HttpContext.Current.Request;
HttpResponse resp = System.Web.HttpContext.Current.Response;
var url = req.QueryString["url"];
//1 Download web data from URL
//2 Write the final edited version of the document to the response object using resp.write(String x);
//3 Add Script tag for dom-outline-1.0 to html agility pack document
//4 Search for relative URLs and correct them to become absolute URL's that point back to the hostname
}
@functions
{
public static void PrintNodes(this HtmlAgilityPack.HtmlNode tag)
{
HttpResponse resp = System.Web.HttpContext.Current.Response;
resp.Write(tag.Name + tag.InnerHtml);
if (!tag.HasChildNodes)
{
return;
}
PrintNodes(tag.FirstChild);
}
public static void AddScriptNode(this HtmlAgilityPack.HtmlNode headNode, HtmlAgilityPack.HtmlDocument htmlDoc, string filePath)
{
string content = "";
using (StreamReader rdr = File.OpenText(filePath))
{
content = rdr.ReadToEnd();
}
if (headNode != null)
{
HtmlAgilityPack.HtmlNode scripts = htmlDoc.CreateElement("script");
scripts.Attributes.Add("type", "text/javascript");
scripts.AppendChild(htmlDoc.CreateComment("\n" + content + "\n"));
headNode.AppendChild(scripts);
}
}
}
<HTML CODE HERE>
@{
HttpRequest req=System.Web.HttpContext.Current.Request;
HttpResponse resp=System.Web.HttpContext.Current.Response;
var url=req.QueryString[“url”];
//1从URL下载web数据
//2使用resp.Write(字符串x)将文档的最终编辑版本写入响应对象;
//3将dom-outline-1.0的脚本标记添加到html agility pack文档中
//4搜索相对URL并将其更正为指向主机名的绝对URL
}
@功能
{
公共静态void PrintNodes(此HtmlAgilityPack.HtmlNode标记)
{
HttpResponse resp=System.Web.HttpContext.Current.Response;
分别写入(tag.Name+tag.InnerHtml);
如果(!tag.HasChildNodes)
{
返回;
}
PrintNodes(tag.FirstChild);
}
公共静态void AddScriptNode(此HtmlAgilityPack.HtmlNode头节点,HtmlAgilityPack.HtmlDocument htmlDoc,字符串文件路径)
{
字符串内容=”;
使用(StreamReader rdr=File.OpenText(filePath))
{
content=rdr.ReadToEnd();
}
if(头节点!=null)
{
HtmlAgilityPack.HtmlNode scripts=htmlDoc.CreateElement(“脚本”);
scripts.Attributes.Add(“type”、“text/javascript”);
scripts.AppendChild(htmlDoc.CreateComment(“\n”+内容+”\n”);
headNode.AppendChild(脚本);
}
}
}
如果你真的很聪明,你会封装设计来接受委托,原因是如果你使用委托,你不必担心引用静态的东西
public委托void MyUrlThing(字符串url,对象可选=null)代码>
可能是某个州
公共枚举URL状态
{
没有一个
好,,
坏的
}
然后,void
将变成UrlState
此外,如果你想你也可以设置一个文本框,盲目地给它CIL
然后,您将使用类似这样的方法编译委托
通过这种方式,您还可以选择使用IL来扩展您想要的内容
你也可以给它CSharp代码我想
如果你想保持你的设计,你也可以选择使用接口。。。然后把编译好的dll放在一个目录中,然后加载它等等。。。按照传统那么,为什么要在自动生成的类中执行此操作?将它从页面中移出,放入一个普通的.cs文件。我不确定,这是我朋友在我加入项目并开始工作时设置的。我不太熟悉我在这里所做的事情,但我认为想法是在html代码中以某种方式使用cshtml代码是的,停止这样做:)视图应该只有很少的代码,依我看。@JonSkeet我刚刚和我的朋友谈过,他说我们只是想做一个概念验证。他知道这并不理想,但为了我的缘故,他试图保持简单:p。你知道我至少可以在哪里解决这个问题,即使这不是我正在做的事情的良好实践吗?“概念验证”并不意味着“一切都错了”。将所有代码放到视图中并不是让事情简单化,而是让你的生活更艰难。不要再这样做了——创建一个新的C#文件很简单。我们只是想做一个概念验证,所以我不确定在这一点上是否需要这样的东西,但是当我们着手实现它时,我会记住你的想法谢谢你的建议。事实证明,如果我从每个方法签名中删除了“this”,那么错误就消失了。我还将c代码移到了一个单独的文件中。所以谢谢你的帮助。当我在做实际网站时,我会考虑使用这些代表。