2014-09-24 2 views
0

В приведенном ниже коде у меня есть текстовое поле внутри сетки на событии onblur. Я хочу вызвать метод на стороне сервера. Я попытался вызвать метод, но в статическом методе он выдает ошибку. view, которое становится null.Как получить значение viewstate? Pls поможет мне решить проблему.Вызов метода с клиентской стороны

Javascript:

function CallingServerSideFunction() { 

      PageMethods.ToUpper(CallSuccess, CallError); 
      function CallSuccess(res) { 
       alert(res); 
      } 

      function CallError() { 
       alert('Error'); 
      } 
     } 

Codebehind:

[System.Web.Services.WebMethod] 
     public static void ToUpper() 
     { 
      AddNewRowToGrid();//throws error how can i call this method? 

     } 

наценки:

<asp:ScriptManager ID="newIndentScriptManager" EnablePageMethods="true" runat="server"></asp:ScriptManager> 



<asp:TemplateField HeaderText="Quantity" ItemStyle-Width="150px"> 
            <ItemTemplate> 
             <asp:TextBox ID="txtQuantity"  runat="server" Height="20px" Width="150px" onblur="CallingServerSideFunction()" > </asp:TextBox> 
            </ItemTemplate>         
           </asp:TemplateField> 


private void AddNewRowToGrid() 
     { 

       int rowIndex = 0; 

       if (ViewState["CurrentTable"] != null) 
       { 
        DataTable dtCurrentTable = (DataTable)ViewState["CurrentTable"]; 
        DataRow drCurrentRow = null; 
        if (dtCurrentTable.Rows.Count > 0) 
        { 
         for (int i = 1; i <= dtCurrentTable.Rows.Count; i++) 
         { 
          //extract the TextBox values        
          DropDownList txtProductName = (DropDownList)gvProduct.Rows[rowIndex].Cells[0].FindControl("ddlProduct"); 
          TextBox txtCurrentStock = (TextBox)gvProduct.Rows[rowIndex].Cells[1].FindControl("txtCurrentStock"); 
          TextBox txtQuantity = (TextBox)gvProduct.Rows[rowIndex].Cells[2].FindControl("txtQuantity"); 
          TextBox txtProductRequiredDate = (TextBox)gvProduct.Rows[rowIndex].Cells[4].FindControl("txtProductRequiredDate"); 
          Label txtUnitType = (Label)gvProduct.Rows[rowIndex].Cells[3].FindControl("lblunittype");        

          drCurrentRow = dtCurrentTable.NewRow(); 

          dtCurrentTable.Rows[i - 1]["Column1"] = txtProductName.Text; 
          dtCurrentTable.Rows[i - 1]["Column2"] = txtCurrentStock.Text; 
          dtCurrentTable.Rows[i - 1]["Column3"] = txtQuantity.Text; 
          dtCurrentTable.Rows[i - 1]["Column4"] = txtProductRequiredDate.Text; 
          dtCurrentTable.Rows[i - 1]["Column5"] = txtUnitType.Text; 

          rowIndex++; 
         } 
         dtCurrentTable.Rows.Add(drCurrentRow); 
         ViewState["CurrentTable"] = dtCurrentTable; 

         gvProduct.DataSource = dtCurrentTable; 
         gvProduct.DataBind(); 
        } 
       } 
       else 
       { 
        Response.Write("ViewState is null"); 
       } 

       //Set Previous Data on Postbacks 
       SetPreviousData(); 


     } 

ответ

0

Вы не можете вызывать методы сервера от клиента, как это. Вы должны были бы обернуть вызов, используя AJAX.

Javascript уже есть метод ToUpper ...

http://www.w3schools.com/jsref/jsref_touppercase.asp

+0

Я исправил это, я могу позвонить, но viewstate значение становится null – user3930037

+0

Я запутался, как вы это называете вообще ...Вы имеете в виду, что в браузере вы нажимаете на текстовое поле, затем вне текстового поля, а затем видите ошибку? Кроме того, где ваш код для AddNewRowToGrid()? – Scottie

+0

текстовое поле находится внутри сетки. Является фактической ошибкой внутри AddNewRowToGrid(); есть состояние представления, которое становится null.Is это из-за статического метода – user3930037

0

ViewState не доступен внутри WebMethods - ViewState доступен только тогда, когда постбэк с веб-страницы и VIEWSTATE скрытое поле доступно.

WebMethods не требуют, чтобы ViewState был POSTED, и они не создают экземпляр объекта Page. Таким образом, вам понадобится другой механизм, такой как Session (хотя у него есть свои проблемы, особенно в сбалансированных нагрузках) для хранения данных, на которые вы в настоящее время полагаетесь в ViewState.

1

Если ваша миссия состоит в том, чтобы использовать весь текст в этом текстовом поле, есть намного более простые способы сделать это.

Метод 1

Это самый простой, поскольку он не требует кодирования, только правила CSS. В вашем head разделе, добавьте это:

<head runat="server"> 
    <style type="text/css"> 
     .upper { 
      text-transform: uppercase; 
     } 
    </style> 
</head> 

И в поле вашего шаблона, измените строку следующим образом:

<asp:TextBox ID="txtQuantity" CssClass="upper" runat="server" Height="20px" Width="150px" onblur="CallingServerSideFunction()" > </asp:TextBox> 

Если у вас есть другие текстовые поля, которые также нужно капитализировать, только добавить, что upper класс ему и альта!

Метод 2

В то время как метод 1 будет капитализировать буквы как пользовательские типов, метод 2 будет капитализировать буквы после закладок пользователя прочь. Вам понадобится jQuery, если ваш проект еще не имеет его. В нижней части страницы ASPX, перед закрывающим тэгом body, добавьте это:

<script type="text/javascript"> 
    $("#<%= GridView1.ClientID %> input[id*='txtQuantity']").focusout(function() { 
     $(this).val($(this).val().toUpperCase()); 
    }); 
</script> 

Я не знаю, что название вашей Grid View есть, но заменить GridView1 с каким-либо именем вашей точки зрения сетки является. Если у вас есть другие текстовые поля, требующие капитализации, просто скопируйте и вставьте этот код и замените txtQuantity на любой идентификатор TextBox. Виола!

+0

Привет, Touper это метод, который я не преобразовываю текст в верхний класс – user3930037

Смежные вопросы