嗨,这真的很奇怪!!
但是看看下面的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
。现在删除任何部分,就能解决问题!!!
这是怎么发生的? 有什么想法吗?
顺便说一句:请帮助我让问题更明显,因为我找不到最好的词语来描述问题。
看来我的问题不清楚!! 我的问题是:asp.net 生成这样错误代码的步骤是什么? 这是怎么回事!! 我不想要异常的解决方案,我已经使用单引号解决了它。
不能将双引号括在双引号中。
<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 一起推出,无论它是什么,例如双引号。
这对我有用:
<div runat="server" id="MainDiv">
<%foreach (string str in new string[]{"First#", "Second#"})%>
<%{%>
<% string str1 = str.Replace("#","div"); %>
<div id='<%= str1%>'>123</div>
<%}%>
</div>
我不确定您是否能够完全弄清楚解析器为何这样做,但从最后一个实际代码行可以明显看出,它的内裤发生了变化。
@__w.Write(“\”> ”);
这是发布 ">,而不仅仅是 > - 这是本声明中的最后一个 V 形标志
<div id="<%=str.Replace("#","div") %>">
因此,此时解析器认为它在字符串中,但找不到终止符,因此失败 - 这意味着最后一个
<%} %> 永远不会被解析 - 并且你的问题发生了。
我建议这是因为解析器以线性方式工作,直到“发现”丢失的字符串终止符才会发生失败。
这很奇怪,在 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>
使用单引号而不是双引号