Nou*_*uny 6 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>
Run Code Online (Sandbox Code Playgroud)
现在,如果你把这个代码放在任何网页中(并且不要担心这段代码的道德,我只是为了表明这个想法)你会得到这个错误:
编译器错误消息: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 ");
}
Run Code Online (Sandbox Code Playgroud)
这是从asp页面生成的代码,这是用于渲染我们的div(MainDiv)的方法,我发现有一个缺少的括号"}"关闭方法或(for循环).
现在问题有三个部分:
1-首先你应该有一个服务器控件(在我们的情况下是MainDiv),我不确定它是否只是div标签.
服务器控制,并使用双引号(例如在其内部的码内2- HTML控制<div id="<%=str的代替<div id='<%=str.
3-任何具有块括号例如关键字:为{},而{},使用{} ...等.
现在删除任何部分,将解决问题!
怎么会发生这种情况?有任何想法吗 ?
顺便说一句:请帮我把问题说得更明白,因为我找不到最好的词来形容这个问题.
看起来我的问题不明确!! 我的问题是:asp.net生成这样一个错误代码的步骤是什么?怎么会发生!! 我不想要异常的解决方案,我已经用单引号解决了它.
您不能用双引号括起双引号.
<div id="<%=str.Replace("#","div") %>">
Run Code Online (Sandbox Code Playgroud)
它无法分辨何时应该开始或结束这是为什么
<div id='<%=str.Replace("#","div") %>'>
Run Code Online (Sandbox Code Playgroud)
会工作.
否则它认为代码是
<div id="<%=str.Replace("
","
div
") %>"
)
Run Code Online (Sandbox Code Playgroud)
这当然没有意义.
根据我的评论更新
添加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>
Run Code Online (Sandbox Code Playgroud)