嗨,这真的很奇怪!!
但请看下面的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生成这样一个错误代码的步骤是什么? 怎么会发生!! 我不想要异常的解决方案,我已经用单引号解决了它。
答案 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)
使用单引号而不是双引号