您不能在普通文件(如您的)中使用代码块 (<%
和),因为 ASP.NET 不会以任何方式解释它们。您可以做的是将文本框的 Id 传递给函数:%>
javascriptfile.js
function loginAlert(ctrl) {
var name = document.getElementById(ctrl).value;
alert(name);
}
然后标记将如下所示:
<asp:Button ID="btnLogin" runat="server" Text="Login"
OnClick="btnLogin_Click" OnClientClick="loginAlert('<%=txtFName.ClientID%>')" />
更新
我没有注意到构造 like<%=...%>
在服务器端控件声明中不起作用的事实(因为它们在Response.Write
页面编译时基本上被转换为语句)。至少有两种方法可以解决这个问题:
您可以对全局可用的名称文本框的 DOM 元素进行引用。您的标记将如下所示:
<script type="text/javascript">
var loginNameId = '<%=txtFName.ClientID%>';
</script>
<asp:Button ID="btnLogin" runat="server" Text="Login"
OnClick="btnLogin_Click" OnClientClick="loginAlert()" />
您的loginAlert
遗嘱如下所示:
function loginAlert() {
var name = document.getElementById(loginNameId).value;
alert(name);
}
我个人不喜欢这个解决方案,因为你用变量污染了全局命名空间,而且总的来说它不是很优雅。
或者,您可以将数据属性与 ASP.NET 数据绑定一起使用。
标记:
<asp:Button ID="btnLogin" data-name='<%# txtFName.ClientID %>' runat="server" Text="Login"
OnClick="btnLogin_Click" OnClientClick="loginAlert(this)" />
JavaScript:
function loginAlert(ctrl) {
var name = document.getElementById(ctrl.readAttribute('data-name')).value;
alert(name);
}
代码隐藏:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
DataBind();
}