Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自动生成的代码需要生成静态类_C#_Asp.net_Razor_Auto Generate - Fatal编程技术网

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代码移到了一个单独的文件中。所以谢谢你的帮助。当我在做实际网站时,我会考虑使用这些代表。