按钮单击时将Angular数据传递给代码隐藏功能

时间:2014-07-30 16:32:19

标签: asp.net .net vb.net angularjs code-behind

我有一个代码隐藏函数,在单击超链接时调用。然后,该函数应从超链接获取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输出

1 个答案:

答案 0 :(得分:3)

正如您从发送到浏览器的HTML中看到的那样,.NET会导致<a>标记在单击时执行javascript函数__doPostBack('ctl00$MainContentPlaceholder$ctl00','')。此函数将包含页面全部内容的<form>标记提交回代码隐藏类。然后,代码隐藏在页面上使用隐藏的表单元素进行特殊魔术,.NET webforms将其放在那里以识别页面的状态。

这是典型的.NET webforms范例,并且比指向url的<a>标记要复杂得多。它与angularjs的使用方式也有很大的不同。你在评论中说过,当硬编码时,数据名称值被正确传递。这可能是__doPostBack函数的作用,并且不足为奇的是它不能很好地使用角度(因为它是在创建角度之前编写的代码每页生成的。您有两种可能的选择:

  1. 将您的<a>代码更改为<input type="button" value="{{invoice.DocumentNumber}}" runat="server" ID="yourButton" />为什么会有效?简单地说,您只需要angular将正确的值转换为html,这样当webforms提交时,数据就会传递到您的页面。由于<a>标记与表单值无关,因此页面正确地忽略其数据名称值。实际上,我很惊讶硬编码的价值根本不起作用,因为表格帖子应该忽略不是形式元素的东西。但是,它不能忽略<input>元素。

  2. 将您的Public Sub btnPrintInvoiceClicked...方法从服务器端onclick处理程序更改为自己的端点。看看http://www.asp.net/web-api或其较旧的网络形式时代的表兄:http://www.codeproject.com/Articles/353260/ASP-NET-Advanced-Generic-Handler-ASHX

  3. 顺便说一句,这是我第一次听说有人试图使用网状角度角色,后者是微软暗示放弃的一点恐龙,前者是流行的JavaScript MVC宠儿。我知道这可能是不可能的,但你应该考虑转移到.NET MVC,因为它是一个更好的后端环境,可以托管你的angularjs应用程序。