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

问题描述 投票:0回答:5

嗨,这真的很奇怪!!

但是看看下面的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)的方法,我发现缺少一个括号“}”来关闭该方法或(for循环) .

现在问题分为三个部分:
1-首先你应该有一个服务器控件(在我们的情况下是MainDiv),我不确定它是否只是div标签。
2- 服务器控件内的 HTML 控件以及其中使用双引号的代码(例如

<div id="<%=str
而不是
<div id='<%=str

3-任何带有方括号的关键字,例如:for{}、while{}、using{}...等

现在删除任何部分,就能解决问题!!!

这是怎么发生的? 有什么想法吗?

顺便说一句:请帮助我让问题更明显,因为我找不到最好的词语来描述问题。

看来我的问题不清楚!! 我的问题是:asp.net 生成这样错误代码的步骤是什么? 这是怎么回事!! 我不想要异常的解决方案,我已经使用单引号解决了它。

asp.net compiler-errors
5个回答
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 一起推出,无论它是什么,例如双引号。


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>

0
投票

我不确定您是否能够完全弄清楚解析器为何这样做,但从最后一个实际代码行可以明显看出,它的内裤发生了变化。

@__w.Write(“\”> ”);

这是发布 ">,而不仅仅是 > - 这是本声明中的最后一个 V 形标志

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

因此,此时解析器认为它在字符串中,但找不到终止符,因此失败 - 这意味着最后一个

<%} %> 永远不会被解析 - 并且你的问题发生了。

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


0
投票

这很奇怪,在 Webform 中使用这种类型的语法可能会出现问题,但我能够编译此代码并将 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> 

0
投票

使用单引号而不是双引号

© www.soinside.com 2019 - 2024. All rights reserved.