如何在javascript中使用两个具有相同ID的文本框获取asp.net用户控件的值

Posted

技术标签:

【中文标题】如何在javascript中使用两个具有相同ID的文本框获取asp.net用户控件的值【英文标题】:How to get the values of an asp.net user control with two textboxes with same id in javascript 【发布时间】:2018-05-17 21:20:50 【问题描述】:

搜索了很多,但无法到达任何地方..我的案例:我有一个名为 DateControl 的 UserControl:

<div class="input-group">
  <div class="input-group-addon">
    <i class="fa fa-calendar"></i>
  </div>
  <asp:TextBox ID="ValueDateTextBox" runat="server" CssClass="form-control input-sm nepali-datepicker ignore" data-inputmask="'alias': 'dd/mm/yyyy'" />
</div>

它有一个我用于日期选择器的文本框。在我的 .aspx 页面中,我使用了这样的控件:

<div class="form-group">
  <label class="control-label col-sm-2">
                                From Date
                            </label>
  <div class="col-sm-3">
    <uc1:DateControl runat="server" ID="FromDateControl" />
  </div>

  <label class="control-label col-sm-2">
                                To Date
                            </label>
  <div class="col-sm-3">
    <uc1:DateControl runat="server" ID="ToDateControl" />
  </div>
</div>
<small class="col-sm-offset-2 text-warning pvInfo"></small>

在我的情况下,我必须从 datepicker 中选择两个日期 FROM 和 TO。从服务器端访问日期没有问题,因为我可以像访问它一样访问它

var fromDate = FromDateControl.ValueDateAd;
var toDate = ToDateControl.ValueDateAd;

这让我得到了选定的日期。但在我的情况下,我需要将这两个日期传递给 ajax 调用。而且由于 datepicker id 都是 ValueDateTextBox,我得到两个选择的日期相同。

JS 代码

 $(document).ready(function()
        $('#ShowInGridButton').on('click',
            function () 
                
                var accountNumberId = $('#DepositAccountNumberIdHiddenField').val();
             
                var fromDateCtrl = $('[id$="FromDateControl"]').find('[id$="ValueDateTextBox"]');
                alert(fromDateCtrl.val());
                var toDateCtrl = $('[id$="ToDateControl"]').find('[id$="ValueDateTextBox"]');
                alert(toDateCtrl.val());

                //var fromDate = $('#ValueDateTextBox').val();
               
                //var toDate = $('#ValueDateTextBox').val();
                var url = "/WebMethods/Deposit.asmx/GetDepositAccountStatement";
                var d =  accountNumberId: accountNumberId, fromDate: fromDate, toDate: toDate ;
                var jqXhr = ajaxPost(url, d);
                jqXhr.done(function (data) 
                    console.log(data);
                    if (data) 
                        var div = $('#CfDataTable').empty();
                        div.append(
                           $("<tr class='success'><th>Tran Date</th><th>Value Date</th><th>Statement Reference</th><th>Check No.</th><th>Collector</th><th>Debit</th><th>Credit</th><th>Balance</th></tr>"));
                      
                        $(data.d).each(function (index, item) 

                            div.append(
                                    $("<tr>")

                                    .append($("<td>").html(TojavascriptDate(item.TranDate)))
                                    .append($("<td>").html(ToJavaScriptDate(item.ValueDate)))
                                    //.append($("<td>").html(item.TranDate))
                                    //.append($("<td>").html(item.ValueDate))
                                    .append($("<td>").html(item.StatementReference))
                                    .append($("<td>").html(item.CheckNumber))
                                    .append($("<td>").html(item.Collector))
                                    .append($("<td>").html(item.Debit))
                                    .append($("<td>").html(item.Credit))
                                    .append($("<td>").html(item.Balance)));


                        );
                    
                ).fail(function () 
                    console.log('Data Retrieve failed.');
                );
            );
    );

所以很明显,相同的 ids 值将是相同的。我什至试着在这里环顾四周

var bothElements = document.querySelectorAll("[id='ValueDateTextBox']");
var first = bothElements[0];
alert(first);

仍然无法从日期选择器中获取所选日期的不同日期。感谢帮助。谢谢。这不是我没有四处寻找可能的解决方案,不得不在这里问。抱歉,如果您的专家开发人员的问题过于模糊。 :)

已编辑

DateControl 背后的代码

 public partial class DateControl : System.Web.UI.UserControl

    public string ValueDateNp
    
        get  return ValueDateTextBox.Text; 
        set  ValueDateTextBox.Text = value; 
    
    public DateTime ValueDateAd
    
        get  return DateConversion.GetEnglishDate(ValueDateTextBox.Text).ToDateTime(); 
        set
        
            if (value == DateTime.MinValue)
            
                ValueDateTextBox.Text = DateConversion.GetCurrentBSServerDate();
            
            ValueDateTextBox.Text = DateConversion.GetNepaliDate(value);
        
    

    public bool IsDateDisabled  get; set; 

    protected override void OnInit(EventArgs e)
    
        if (!IsPostBack)
        
            ValueDateTextBox.Text = DateConversion.GetCurrentBSServerDate();
        
    

    protected override void OnLoad(EventArgs e)
    
        if (!IsPostBack)
        
            ValueDateTextBox.Focus();
        
        if (IsDateDisabled)
        
            ValueDateTextBox.MakeReadOnly();
            ValueDateTextBox.CssClass.Remove(3);
        
    

    public void BindDataProperty<T>(Expression<Func<T, object>> property)
    
        ValueDateTextBox.SetDataBindPropertyName(property);
    




【问题讨论】:

ID 必须是唯一的。使用类而不是 id。 @Andreas 你好先生..即使我使用类,因为只有一个 ValueDateTextBox,我如何获得两个不同的选择值?谢谢 如果你使用 JS 来选择给定类的元素,你会得到一个数组中返回的两个文本框,你可以循环遍历数组来查找各个值。 @ADyson 谢谢陛下。介意给我一个例子来说明我的情况。一个小的 sn-p 会很有帮助。我是 Js 的新手。这不是我知道的代码工厂,但有一点帮助赞赏。:) var dates = $(".datepicker"); 为您获取字段(假设它们具有跨两个文本框共享的类“datepicker”)。然后,使用 jQuery,您可以使用 .each() 方法对它们进行循环。 api.jquery.com/each 。粗略示例:dates.each(function() alert( this.value); ); 【参考方案1】:

由于您有一个带有 id(FromDateControl & ToDateControl) 的父容器,您可以使用它们来查找内部子容器。

var fromDateCtrl = $('[id$="FromDateControl"]').find('[id$="ValueDateTextBox"]');
alert(fromDateCtrl.val());

【讨论】:

检查alert($('[id$="FromDateControl"]').length) 现在得到 0 先生 与其寻找解决方法,不如使用有效的标记并将 id 替换为类 @oldmonk 欢迎来到 Web 开发,在 js 和 jq 中编码时,您必须确保尝试查找某个元素的脚本应始终在加载该元素后运行。有一些其他方法可以在添加动态元素后立即找到它们,但这是不同的。您可以在文件末尾添加代码,也可以将其包装在文档就绪事件中。 @oldmonk inside find() 尝试将$ 替换为*。 (find('[id*="ValueDateTextBox"]'))

以上是关于如何在javascript中使用两个具有相同ID的文本框获取asp.net用户控件的值的主要内容,如果未能解决你的问题,请参考以下文章

如何合并具有“相同父亲”、相同方法和相同 id=0 的两个节点(使用 XSLT)?

如何合并列中具有相同值的两个表

两个 html 元素可以具有相同的 id 但属于不同的类吗?

两个不同页面上的两个元素可以在 HTML/CSS 中具有相同的 ID 吗?

如何在JavaScript中确认两个密码相同

如果json对象键在javascript中具有所有相同的值,如何检查并返回true?