【问题标题】:Explicitly define control prefix in ASP.NET 1.1?在 ASP.NET 1.1 中显式定义控件前缀?
【发布时间】:2011-08-15 18:54:24
【问题描述】:

我有一些(写得很糟糕的)遗留代码必须修改,但我在控件的前缀方面遇到了一个奇怪的问题。

主页有几个包含文件,包括cpct_cost.aspx。 在该包含的页面中是一个控制 EquipmentCost:

<INPUT id="EquipmentCost" type="text" name="EquipmentCost" runat="server" size="10" onchange="TotalCost();" class="bk">

在客户端javascript中控制的另一个页面引用:

function TotalCost()
{
    var a = document.CPCT_FORM.cpct_cost_EquipmentCost.value;

这会引发客户端错误,因为当我在本地运行代码时,控件被命名为 $ 而不是 _:

<input name="cpct_cost$EquipmentCost" type="text" id="cpct_cost_EquipmentCost" size="10" onchange="TotalCost();" class="bk" />

因此,客户端 javascript 无法找到有问题的元素。

服务器上的旧代码以不同方式处理此问题 - 那里的控件名称被处理为:

<input name="cpct_cost:EquipmentCost" id="cpct_cost_EquipmentCost" type="text" size="10" onchange="TotalCost();" class="bk" />

并且正在正确处理。

一开始我以为这可能是本地 IIS 设置,所以我编译了我的代码并将其部署到开发服务器,但行为与我的本地执行相同。

我正在使用应该是最新的源文件,我没有更改任何项目设置,所以...有什么方法可以强制 my 机器中的代码使用 : 而不是 $?或者……我错过了什么?

该项目目前在提议列表中进行完全重新架构,(所以请不要建议重新设计应用程序 ;))但同时,我有一个短期要求在这个丑陋的地方实现一些小的新功能老野兽,我必须尽快完成它。令人沮丧的是 - 我根本没有更改代码的这些部分,但行为无论如何都在改变。

更新

显然,至少在 .NET 1.1 中使用的命名前缀有些随机,因为在多次构建之后,当我尝试各种方法来解决这个问题时,控件最终获得了 正确的 名称。所以现在我只是不更改代码,这很糟糕,因为我真的很讨厌这种“在随机正确时冻结它”的方法。

【问题讨论】:

    标签: c# javascript asp.net-1.1


    【解决方案1】:

    您可以将输入控件的引用作为参数传递给 JS 函数,即:

    <INPUT id="EquipmentCost" type="text" name="EquipmentCost" runat="server" size="10" onchange="TotalCost(this);" class="bk">
    
    function TotalCost(txtEquipCost) {
    var a = txtEquipCost.value;
    }
    

    那么 id 是什么就无所谓了。

    编辑:
    如果你有更多的控件,在页面上创建JS变量,例如:

    var txtEquipCost = document.getElementById('<%= YourControl.ClientID %>');
    var txtOtherCost = document.getElementById('<%= YourOtherControl.ClientID %>');
    

    那么 onChange 函数调用可以是 TotalCost(txtEquipCost, txtOtherCost)

    EDIT2:
    请参阅这个关于 ClientId 和 UniqueId 的问题,这可能有用: C# asp.net Why is there a difference between ClientID and UniqueID?

    【讨论】:

    • 一个好主意,除了 TotalCost 正在寻找大约 6 种不同的控件。 :( 我有没有提到这个网络应用的架构很糟糕?
    • 通过在页面上创建带有控件的JS变量来扩展想法,例如 var txtEquipCost = document.getElementById(''); var txtOtherCost = document.getElementById('');那么 onChange 函数调用可以是 TotalCost(txtEqiupCost, txtOtherCost);
    • 这是个好主意 - 周一会试试看!
    • 完美运行,谢谢!一个糟糕的问题的绝佳解决方案!
    【解决方案2】:

    您可以更改您的 Javascript 以使用生成的 id。

    function TotalCost()
    {
        var a = document.getElementById('<%= YourControl.ClientID %>').value;
    }
    

    此外,如果您需要对该控件的生成 id 进行绝对控制,事实证明,在 asp.net 4.0 中引入了 ClientIDMode 属性,以便开发人员可以更好地控制该 id 的生成方式。

    查看这两个来源

    http://msdn.microsoft.com/en-us/library/system.web.ui.control.clientid.aspx

    http://weblogs.asp.net/asptest/archive/2009/01/06/asp-net-4-0-clientid-overview.aspx

    【讨论】:

    • 遗憾的是,我现在被锁定在 ASP.NET 1.1 中。我尝试了 方法,但由于控件是在包含文件中定义的,但引用它的函数在不同的文件中,它似乎不喜欢那个组合。
    猜你喜欢
    • 2018-02-22
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 2021-11-01
    • 2012-03-02
    • 2021-03-31
    • 1970-01-01
    相关资源
    最近更新 更多