【问题标题】:Select Control Populated from JavaScript Returns Empty Value选择从 JavaScript 填充的控件返回空值
【发布时间】:2011-07-01 04:00:47
【问题描述】:

在我的 ASP.NET 应用程序中,我有一个服务器端 HTML 选择控件。

<select id="CompanyDropDown" runat="server" style="width:330px">
</select>

然后,我的页面上有一个链接,该链接运行一个 JavaScript 函数,该函数填充此控件,并选择“当前”项。我可以看到这是有效的,因为列表包含所有项目并且选择了正确的项目。

但是,当页面响应按钮单击而回发时。

<asp:Button runat="server" ID="btnSaveCompany" Text="Save" 
    onclick="btnSaveCompany_Click" />

CompanyDropDown.Value 为空,并且不包含任何项目。关于如何在回发中查看所选值的任何建议?

(注意:我尝试使用 ASP.NET DropDown 控件,但是当控件包含在呈现页面后添加的项目时,回发验证失败。)

【问题讨论】:

    标签: javascript asp.net select postback


    【解决方案1】:

    由于使用 JavaScript 添加到列表中的项目不是视图状态的一部分,因此无法在服务器端检索它们。如果您只是想获取选定的值,请在页面上放置一个服务器端隐藏字段,并在每次更改下拉列表的选择时使用 JavaScript 设置其值:

    jQuery 脚本

    $('#CompanyDropDown').change(function() {
        $('#inpSelectValue').val($(this).val());
    });
    

    隐藏字段标记

    <input runat="server" id="inpSelectValue" clientidmode="static" type="hidden" />
    

    隐藏字段的值将在回发时被传送到服务器。参考它以检索所选项目的值。请务必将clientidmode="static" 添加到您的下拉列表中,以保持控件的呈现ID 设置为您在ASPX 页面中分配的ID(即CompanyDropDown 而不是parentContainer_CompanyDropDown):

    <select id="CompanyDropDown" runat="server" style="width:330px"
        clientidmode="static" />
    

    或者,您可以使用 AJAX 告诉服务器您正在添加每个动态生成的列表项或更改选择。仅当您需要维护一个项目列表以及选择哪个项目时,我才会这样做。

    【讨论】:

    • @Justin:我一辈子都无法让它发挥作用。我验证了我的 JavaScript 例程被调用并正确更新了隐藏字段。但是,在回发时,隐藏字段的值与呈现页面时的值相同。
    • @Justin:不在标记中,但我正在从服务器代码初始化隐藏字段的值。这是否会阻止新值回发?
    • @Jon,不,没关系。您是否正在初始化除空白以外的其他内容以确保未设置该值?你确定 JavaScript 工作正常吗?设置值后将alert($('#inpSelectedValue').val());添加到change方法中。
    • @Justin:我已经使用调试器逐步完成了 JavaScript。它工作正常。我还看到我使用Request.Form[HiddenCompanyId.Name] 获得了服务器端的值。它肯定设置正确。 RE:“您是否正在初始化除空白之外的其他内容...”,我将隐藏字段值初始化为“403”,JavaScript 使用它在填充列表时选择当前项目。
    • 我刚刚验证过,如果我初始化隐藏字段服务器端,那么它可以工作。初始化隐藏字段会导致任何值丢失。我最好的猜测是初始化它会使值成为视图状态的一部分,它会在回发后恢复初始值。对我来说没有完全的意义,但这是我对我所观察到的最好的解释。
    【解决方案2】:

    在 JS 中操作的值无法在服务器端检索,也无法在回发时保留。您可以将SelectedValue 放在隐藏字段中。在页面回发中,您必须再次设置 SelectedValue,并将其保存在隐藏字段中。

    【讨论】:

    • @Muhammad:谢谢,但即使这样也不适合我。我确认我正在正确更新隐藏字段的值。但是,在回发时,它也已恢复到呈现页面时的值。
    • 您已经在页面渲染之前更新了回发时的 SelectedValue。
    • @Muhammad:我没有在服务器上设置 SelectedValue。但是,我确实初始化了隐藏字段值。这是否会阻止新值被回发?
    • 在服务器端,当您尝试设置 SelectedValue 时,您可以检查 CompanyDropDown.Items.Count 吗?
    • 在标记中,CompanyDropDown 被定义为&lt;select id="CompanyDropDown" runat="server" style="width:330px" onchange="UpdateHiddenCompanyId();"&gt;&lt;/select&gt;。它很空,我向你保证。如果单击链接,它只会在客户端填充。
    【解决方案3】:

    您可以使用 Request.Form[CompanyDropDown.UniqueID]。这将在没有隐藏字段的情况下工作。

    【讨论】:

    • 不知道为什么这不是最佳答案,它在不添加额外隐藏输入并尝试保持值同步的情况下效果很好。
    猜你喜欢
    • 1970-01-01
    • 2011-09-25
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多