如何顽固地将旧的JavaScript事件处理程序保留在Web表单页面中,并将其移植到ASP.NET MVC?

如何顽固地将旧的JavaScript事件处理程序保留在Web表单页面中,并将其移植到ASP.NET MVC?,javascript,asp.net-mvc,event-handling,porting,Javascript,Asp.net Mvc,Event Handling,Porting,考虑.ASPX文件中的一行标记,如下所示: <asp:DropDownList ID="drpdownPayPlan" runat="server" onchange="javascript: document.getElementById('txtPayAmount').value = document.getElementById('drpdownPayPlan').value.replace(',', '');"> 0x800a138f-JavaScript运行时错误:无法

考虑.ASPX文件中的一行标记,如下所示:

<asp:DropDownList ID="drpdownPayPlan" runat="server" onchange="javascript: document.getElementById('txtPayAmount').value = document.getElementById('drpdownPayPlan').value.replace(',', '');">

0x800a138f-JavaScript运行时错误:无法获取属性“value” 指未定义的或空的引用

在呈现时,源代码在第410行实际读取如下内容(我理解名称损坏的原因):



所以,恕我直言,我没有给我讲道如何正确地将WebForms项目移植到MVC(很抱歉听起来像一个叛逆和不合作的青少年!)--如何解决这一行标记的问题?

在尝试分配服务器端控件名(由于默认的服务器控件行为分配
AutoID
)而不是客户端名称时,ASPX页面中经常出现
0x800a138f
错误,因此
document.getElementById('drpdownPayPlan')
返回
undefined

有两种解决方法:

  • ClientIDMode=“Static”
    分配给涉及的每个服务器控件(我假设
    txtPayAmount
    是一个
    TextBox
    服务器控件,如果您使用的是文本输入文本框,请保持
    txtPayAmount
    不变)

  • 注意,我建议您在函数中将JS部分与服务器控件分离,并调用函数名,如下所示:

    <asp:DropDownList ID="drpdownPayPlan" runat="server" onchange="changePayAmount();">
    
    <script type="text/javascript">
    function changePayAmount() {
        document.getElementById('<%= txtPayAmount.ClientID %>').value = document.getElementById('<%= drpdownPayPlan.ClientID %>').value.replace(',', '');
    }
    </script>
    
    类似问题:


    谢谢你,@Tetsuya Yamamoto!你的第一个选择成功了!在发布问题之前,我自己也尝试过第二种选择,因为我只知道这一点,但这不会改变结果。然而,正如您所建议的,将clientdmode=“Static”分配给涉及的每个服务器控件确实解决了我的问题!我在txtPayAmount控制标签和drpdownPayPlan上都设置了该属性。瞧!多莫·阿里加托·戈扎伊马苏!
    <asp:TextBox ID="txtPayAmount" runat="server" ClientIDMode="Static" />
    <asp:DropDownList ID="drpdownPayPlan" runat="server" ClientIDMode="Static" onchange="javascript: document.getElementById('txtPayAmount').value = document.getElementById('drpdownPayPlan').value.replace(',', '');">
    
    <asp:DropDownList ID="drpdownPayPlan" runat="server" onchange="javascript: document.getElementById('<%= txtPayAmount.ClientID %>').value = document.getElementById('<%= drpdownPayPlan.ClientID %>').value.replace(',', '');">
    
    <asp:DropDownList ID="drpdownPayPlan" runat="server" onchange="changePayAmount();">
    
    <script type="text/javascript">
    function changePayAmount() {
        document.getElementById('<%= txtPayAmount.ClientID %>').value = document.getElementById('<%= drpdownPayPlan.ClientID %>').value.replace(',', '');
    }
    </script>
    
    @Html.DropDownListFor(model => model.PayPlan, Model.PayPlanList as SelectList, new { id = "drpdownPayPlan" })