Null Asp.Net控件导致Javascript对象引用未设置为渲染上的对象实例

时间:2015-07-01 17:20:50

标签: javascript jquery asp.net jquery-ui-autocomplete

总结起来,这段代码将Jquery自动完成添加到位于UpdatePanel内部的Asp.Net Formview内的文本框中。

以下代码没有任何问题,除非InsuranceInsertItemTextBox为null,当Formview处于只读模式时总是如此。如果控件为null,我尝试使用if语句终止函数,但这不起作用。如果将Formview模式设置为readonly,我也尝试终止该语句,但这也不起作用。有关处理此错误的任何建议吗? 仅供参考:LINE 33(在堆栈跟踪中标识)是InitAutoCompl函数内部的if语句。如果我删除if语句,则错误转到下一行。

        $(document).ready(function () {
            var prm = Sys.WebForms.PageRequestManager.getInstance();
            prm.add_initializeRequest(InitializeRequest);
            prm.add_endRequest(EndRequest);
             InitAutoCompl();  
        });

        function InitializeRequest(sender, args) {
        }

        function EndRequest(sender, args) {                
            InitAutoCompl();
        }    function InitAutoCompl(freeInput) {

                if (!document.getElementById('<%= CaseInformationFormView.FindControl("InsuranceInsertItemTextBox").ClientID %>'))return;
                $('#<%= CaseInformationFormView.FindControl("InsuranceInsertItemTextBox").ClientID %>').autocomplete({
                    source: function(request, response) {
                        $.ajax({
                            url: '<%= Page.ResolveUrl("PacketsForUpload.aspx/GetInsuranceCompanies") %>',
                            data: "{ 'prefix': '" + request.term + "'}",
                            dataType: "json",
                            type: "POST",
                            contentType: "application/json; charset=utf-8",
                            messages: {
                                noResults: '',
                                results: function() {}
                            },
                            success: function(data) {
                                response($.map(data.d, function(item) {
                                    return {
                                        label: item.split("-")[0],
                                        val: item.split("-")[1]
                                    };
                                }));
                            },
                            error: function(response) {
                                alert(response.responseText);
                            },
                            failure: function(response) {
                                alert(response.responseText);
                            }
                        });
                    },
                    change: function(e, ui) {
                        if (!(freeInput || ui.item)) e.target.value = "";
                        Page_ClientValidate();
                    },
                    select: function(e, i) {
                        console.log("i.item", i.item);
                        Page_ClientValidate();
                    },
                    minLength: 3

                });
            };

堆栈追踪:

[NullReferenceException: Object reference not set to an instance of an object.]
ASP.packetsforupload_aspx.__RenderPacketsHeadContent(HtmlTextWriter __w, Control parameterContainer) in :33
System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +268
System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8
System.Web.UI.Control.Render(HtmlTextWriter writer) +10
System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +57
System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100
System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25
System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +128
System.Web.UI.HtmlControls.HtmlHead.RenderChildren(HtmlTextWriter writer) +21
System.Web.UI.HtmlControls.HtmlContainerControl.Render(HtmlTextWriter writer) +32
System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +57
System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100
System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25
System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +128
System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8
System.Web.UI.Control.Render(HtmlTextWriter writer) +10
System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +57
System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100
System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25
System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +128
System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8
System.Web.UI.Page.Render(HtmlTextWriter writer) +29
System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +57
System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100
System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1386

编辑: 另外,我只是想通了返回不会破坏功能。我通过删除if语句并在那里返回来测试这个。错误仍然存​​在。

1 个答案:

答案 0 :(得分:2)

如果控制&#39; InsuranceInsertItemTextBox&#39;不是CaseInformationFormView的子控件,那么CaseInformationFormView.FindControl(&#34; InsuranceInsertItemTextBox&#34;)为null,调用属性ClientID将生成NRE。

您可以通过在获取ClientID之前检查控件是否可用来防范此情况:

function InitAutoCompl(freeInput) {
      $('#<%= CaseInformationFormView.FindControl("InsuranceInsertItemTextBox") != null ?CaseInformationFormView.FindControl("InsuranceInsertItemTextBox").ClientID :  "" %>').autocomplete({
        source: function (request, response) {
          $.ajax({
            url: '<%= Page.ResolveUrl("PacketsForUpload.aspx/GetInsuranceCompanies") %>',
            data: "{ 'prefix': '" + request.term + "'}",
            dataType: "json",
            type: "POST",
            contentType: "application/json; charset=utf-8",
            messages: {
              noResults: '',
              results: function () { }
            },
            success: function (data) {
              response($.map(data.d, function (item) {
                return {
                  label: item.split("-")[0],
                  val: item.split("-")[1]
                };
              }));
            },
            error: function (response) {
              alert(response.responseText);
            },
            failure: function (response) {
              alert(response.responseText);
            }
          });
        },
        change: function (e, ui) {
          if (!(freeInput || ui.item)) e.target.value = "";
          Page_ClientValidate();
        },
        select: function (e, i) {
          console.log("i.item", i.item);
          Page_ClientValidate();
        },
        minLength: 3

      });
    };