我正在尝试创建像这样的onclick事件
onClientClick="document.querySelector('[KPI="31"]').value = '';return false;"
KPI =值必须是数据绑定的,所以我使用类似的代码
onClientClick="<%# document.querySelector('[KPI=Eval("KPI_ID")]').value = '';return false; %>"
但是我收到错误,说服务器代码没有很好地定义。任何人都可以帮忙..
答案 0 :(得分:0)
如果您的数据源是对象的集合,并且您正在请求名为KPI_ID的属性,则可以避免使用Eval并使用Item或Container.DataItem。
我最简单的方法是展示这个是Container.DataItem,因为我不知道你用什么样的控件来绑定。 Container.DataItem应该是您的对象,因此您只需将其强制转换为dataType
onClientClick="document.querySelector('[KPI=<%# ((YourDataType)Container.DataItem).KPI_ID %>)]').value = '';return false;"
如果在.Net 4.5中使用Repeater,可以将Repeater的ItemType设置为DataType,这样就可以将((YourDataType)Container.DataItem)替换为Item:
onClientClick="document.querySelector('[KPI=<%# Item.KPI_ID %>)]').value = '';return false;"
如果您没有使用对象的属性,而KPI_ID是用于获取实际值的字符串,例如如果它在DataRow中,你必须避免在整个字符串中使用“,而不让编译器知道它不是属性的结尾。你可以通过使用'来指示属性的开始和结束并使用string.Format来做到这一点。所以你的javascript中的单引号是文本的一部分,编译器知道它不是属性的结尾:
onClientClick='<%# string.Format("document.querySelector('[KPI={0}]').value = '';
return false;", Eval("KPI_ID")) %>'
更新: 要支持额外的双重报价,您可以这样做:
onClientClick='<%# string.Format("document.querySelector('[KPI=\"{0}\"]').value = '';
return false;", Eval("KPI_ID")) %>'
如果您想避免使用Eval,可以用Item.KPI_ID或((YourDataType)Container.DataItem).KPI_ID替换Eval(“KPI_ID”)。