在asp.Net中,在控制标记中编写代码会生成编译错误

时间:2012-03-22 11:09:49

标签: asp.net compiler-construction compiler-errors

嗨,这真的很奇怪!!

但请看下面的asp代码:

    <div runat="server" id="MainDiv">
      <%foreach (string str in new string[]{"First#", "Second#"})
          { %>
            <div id="<%=str.Replace("#","div") %>">
            </div>
        <%} %>
    </div>

现在,如果你把这个代码放在任何网页中(并且不用担心这段代码的道德,我只是为了表明这个想法) 你会收到这个错误:

编译器错误消息:CS1518:预期的类,委托,枚举,接口或结构

当然错误与真正的问题无关,我搜索了asp.net生成的代码,并想出了以下内容:

     private void @__RenderMainDiv(System.Web.UI.HtmlTextWriter @__w, System.Web.UI.Control parameterContainer)
    {
        @__w.Write("\r\n        ");

        #line 20 "blabla\blabla\Default.aspx"
        foreach (string str in new string[] { "First#", "Second#" })
        {

            #line default
            #line hidden
            @__w.Write("\r\n        <div id=\"");

            #line 22 "blabla\blabla\Default.aspx"
            @__w.Write(str.Replace("#", "div"));


            #line default
            #line hidden
            @__w.Write("\">\r\n        ");
     }

这是从asp页面生成的代码,这是用于渲染我们的div(MainDiv)的方法,我发现有一个缺少的括号“}”关闭方法或(对于循环)。

现在问题有三个部分:
1-首先你应该有一个服务器控件(在我们的情况下是MainDiv),我不确定它是否只是div标签。
2-服务器控件内部的HTML控件及其中的代码使用双引号(例如<div id="<%=str而不是<div id='<%=str
3 - 包含大括号的所有关键字,例如:{} {},而{},使用{} ...等等。

现在删除任何部分,都会解决问题!!!

这是怎么回事? 任何想法?

顺便说一句:请帮助我提出更明显的问题,因为我无法找到最好的词来形容这个问题。

看起来我的问题不明确!! 我的问题是:asp.net生成这样一个错误代码的步骤是什么? 怎么会发生!! 我不想要异常的解决方案,我已经用单引号解决了它。

5 个答案:

答案 0 :(得分:6)

您不能用双引号括起双引号。

<div id="<%=str.Replace("#","div") %>">

它无法判断何时应该开始或结束这是为什么

<div id='<%=str.Replace("#","div") %>'>

会起作用。

否则它认为代码是

 <div id="<%=str.Replace("
 ","
 div
 ") %>"
 )

当然没有任何意义。

根据我在下面的评论进行更新

添加runat="server"会导致控件被ASP.NET解析,否则它只是直接传递为html。

如果它被ASP.NET解析,那么事情会有所不同。说实话,我不确定这里的确切内部运作方式。我可以告诉你的是,如果设置了runat="server"属性,那么ASP.NET将对其进行解析,并按不同的规则进行播放。

它将尝试分解内部html,如上所述。

如果runat="server"属性被删除,那么它将作为html传递出来,因此内联代码会被处理,然后只是推出周围的html,无论它是什么,例如双引号。

答案 1 :(得分:0)

这对我有用:

<div runat="server" id="MainDiv">
      <%foreach (string str in new string[]{"First#", "Second#"})%>
          <%{%>
          <% string str1 = str.Replace("#","div"); %>
           <div id='<%= str1%>'>123</div> 
           <%}%>
</div>

答案 2 :(得分:0)

我不确定你是否能够完全弄清楚解析器为什么会这样做,但从上一个真正的代码行中可以明显看出它已经扭曲了。

  

@__ w.Write(“\”&gt; \ r \ n“);

这是推出“&gt; 而不只是&gt; - 这是本声明中的最后一个雪佛龙

<div id="<%=str.Replace("#","div") %>">

所以,此时解析器认为它在一个字符串中,但没有找到终结符,所以失败了 - 这意味着最后一个

  

&lt;%}%&gt;   永远不会被解析 - 你的问题就出现了。

我建议这是因为解析器是以线性方式工作的,直到发现失败的字符串终结符才会发生失败。

答案 3 :(得分:0)

这很奇怪,将这种类型的语法与webforms一起使用可能是一个问题,但是我能够编译这些代码并将div渲染到页面:

<div runat="server" id="MainDiv">
  <%foreach (string str in new string[] {"First#", "Second#"})
      {%>
        <div id='<%= string.Format("{0}", str.Replace("#","div")) %>'>
            Testing
        </div>
    <%}%>
</div> 

答案 4 :(得分:0)

使用单引号而不是双引号