2015-07-01 1 views
0

Подводя итог, этот код добавляет автозаполнение Jquery в текстовое поле внутри формы представления Asp.Net, которая находится внутри UpdatePanel ,Null Asp.Net Control Causeing Javascript Ссылка на объект не установлена ​​в экземпляр объекта в рендере

Следующий код работает без каких-либо проблем, если InsuranceInsertItemTextBox не равен null, что всегда происходит, когда Formview находится в режиме readonly. Я попытался использовать оператор if для завершения функции, если элемент управления имеет значение NULL, но это не работает. Я также попытался завершить утверждение, если режим просмотра формы установлен на чтение, но это тоже не сработало. Любые предложения по устранению этой ошибки? FYI: LINE 33 (идентифицируется в трассировке стека) является оператором if внутри функции InitAutoCompl. Если я удалю оператор 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 

EDIT: Кроме того, я просто понял, что возвращение не будет нарушать функцию. Я проверил это, удалив инструкцию if и просто вернув туда. Ошибка все еще происходит.

ответ

1

Если контроль «InsuranceInsertItemTextBox» не является дочерним элементом управления CaseInformationFormView, тогда CaseInformationFormView.FindControl («InsuranceInsertItemTextBox») является нулевым и вызывающим свойством 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 

     }); 
    }; 
+0

Спасибо за ваш ответ. Я просто проверил это, и это не сработало. Кроме того, я решил проверить возвращение в целом как способ выхода из моей функции. Если я заменил оператор if возвратом, просто чтобы увидеть, работает ли возврат вообще, я все равно получаю ошибку. – TimidObserver

+0

Да, возврат из функции не поможет, так как доступ к ClientID возникает на стороне сервера. Вместо этого, определение ClientID должно учитывать случай, когда элемент управления недоступен. См. Измененную функцию. – HashPsi

+0

Хорошо, спасибо за помощь. Я проведу это завтра. – TimidObserver