Gridview中的锚标记没有很好地形成服务器标记

时间:2013-01-21 10:13:05

标签: c# asp.net html

为什么

 <a id="link" runat="server" href="javascript:downloadFile('<%#Eval("TempKey") %>')"><%#Eval("ShortFileName") %></a>

在我的asp.net应用程序中给出了The server tag is not well formed异常?

出了什么问题?如果我删除runat="server",那就没问题。但我需要从后面的代码中处理它(在gridview中)。

非常感谢!!

4 个答案:

答案 0 :(得分:4)

您收到The server tag is not well formed错误,因为您在双引号内使用双引号,使attribute-name="value"种语法变为干线。它将被ASP.NET编译器解析为

href="javascript:downloadFile('<%#Eval(" TempKey ") %>')">

TempKey将显示为单独的属性,没有值等。
当您删除服务器标签时,ASP.NET不会解析它的html元素语法,而是按原样发出它(它的无效html以及浏览器更宽容)。

您应该在单引号内尝试,例如

href='javascript:downloadFile("<%#Eval("TempKey") %>")'

修改 上面仍然会产生有问题的html,因为href值会有未转义的双引号。所以试试这个:

href='javascript:downloadFile(&quot;<%#Eval("TempKey") %>&quot;)'

修改 似乎数据绑定表达式未在上面进行评估。请尝试以下表达式使用Eval重载进行格式化

href='<%# Eval("TempKey", "javascript:downloadFile(&quot;{0}&quot;)") %>'

修改 另一种方法是使用一些代码隐藏方法 - 例如,

href='<%# GetFileLink(Container.DataItem) %>)'

代码隐藏

protected string GetFileLink(object dataItem)
{
   return string.Format("javascript:downloadFile('{0}');", 
           DataBinder.Eval(dataItem, "TempKey")); 
}

答案 1 :(得分:3)

在我的网格视图中,我使用了Linkbutton并在 OnClientClick 上应用了以下代码。

    <asp:TemplateField HeaderText="Print">
    <ItemTemplate>
     <asp:LinkButton ID="lbtn_prntmenu" runat="server" CssClass="mlinks" CommandArgument='<%#Eval("ID")%>' CommandName="Print" Text="Print" OnClientClick='<%#Eval("ID","javascript:downloadFile(\"{0}\");")%>'></asp:LinkButton>
</ItemTemplate>

</asp:TemplateField>

同样,您可以使用<a>

上的href元素

答案 2 :(得分:2)

  

出了什么问题?

ASP.NET解析器混淆了嵌套的双引号。 我只是意识到VS2012似乎不再发生了。

  

如果我删除runat =“server”,那就没问题。但我需要从后面的代码中处理它(在gridview中)。

如果你有一个DataItem类,你可以尝试转换:

<a id="link" runat="server" href="javascript:downloadFile('<%#((YourNamespace.YourClass)Container.DataItem).TempKey%>')"><%#Eval("ShortFileName") %></a>

最好的办法应该是在codebehind中设置href(这是一个拥有runat =“server”控件的点)

希望这会有所帮助,

答案 3 :(得分:1)

请尝试以下代码:

onclick='<%# "return jsPopup('UpdateProbAct.aspx?Table=problems&Deptid=" + Eval("department") %>'