我有一个代码隐藏函数,在单击超链接时调用。然后,该函数应从超链接获取name属性,并使用该字符串调用另一个函数。 name属性由角度ngRepeat填充。我的问题是,当我尝试在代码隐藏中获取name属性时,它只显示一个空字符串而不是名称属性"应该"已经通过了。
HTML
<a href="javascript:;" data-name="{{invoice.DocumentNumber}}" runat="server" onserverclick="btnPrintInvoiceClicked">Print Invoice</a>
最终HTML输出
<a data-name="90979157" href="javascript:__doPostBack('ctl00$MainContentPlaceholder$ctl00','')">Print Invoice</a>
VB Code-Behind
Public Sub btnPrintInvoiceClicked(ByVal sender As Object, ByVal e As EventArgs)
Dim inv As HtmlAnchor = CType(sender, HtmlAnchor)
Dim invoiceNumber As String = inv.Name
GetInvoicePDF(invoiceNumber)
End Sub
提前致谢!
编辑:添加了HTML输出
答案 0 :(得分:3)
正如您从发送到浏览器的HTML中看到的那样,.NET会导致<a>
标记在单击时执行javascript函数__doPostBack('ctl00$MainContentPlaceholder$ctl00','')
。此函数将包含页面全部内容的<form>
标记提交回代码隐藏类。然后,代码隐藏在页面上使用隐藏的表单元素进行特殊魔术,.NET webforms将其放在那里以识别页面的状态。
这是典型的.NET webforms范例,并且比指向url的<a>
标记要复杂得多。它与angularjs的使用方式也有很大的不同。你在评论中说过,当硬编码时,数据名称值被正确传递。这可能是__doPostBack
函数的作用,并且不足为奇的是它不能很好地使用角度(因为它是在创建角度之前编写的代码每页生成的。您有两种可能的选择:
将您的<a>
代码更改为<input type="button" value="{{invoice.DocumentNumber}}" runat="server" ID="yourButton" />
为什么会有效?简单地说,您只需要angular将正确的值转换为html,这样当webforms提交时,数据就会传递到您的页面。由于<a>
标记与表单值无关,因此页面正确地忽略其数据名称值。实际上,我很惊讶硬编码的价值根本不起作用,因为表格帖子应该忽略不是形式元素的东西。但是,它不能忽略<input>
元素。
将您的Public Sub btnPrintInvoiceClicked...
方法从服务器端onclick处理程序更改为自己的端点。看看http://www.asp.net/web-api或其较旧的网络形式时代的表兄:http://www.codeproject.com/Articles/353260/ASP-NET-Advanced-Generic-Handler-ASHX
顺便说一句,这是我第一次听说有人试图使用网状角度角色,后者是微软暗示放弃的一点恐龙,前者是流行的JavaScript MVC宠儿。我知道这可能是不可能的,但你应该考虑转移到.NET MVC,因为它是一个更好的后端环境,可以托管你的angularjs应用程序。