2014-03-13 108 views
1

我接管了一個客戶端有一些煩人的問題的項目。 他們有一個下拉菜單,可以將選定的文本放入t-sql查詢中進行自動回覆。任何具有撇號的值由於未被轉義而導致查詢錯誤在asp.net autopostback之前更改下拉菜單項的文本

我沒有編譯代碼的訪問權限,但希望能夠在發佈替換撇號之前對選定的已更改內容編寫快速的創可貼修復到一個雙撇號來逃避它,因爲它進入查詢。

我寫了一個javscript ddl.change函數,用於更改文本。

儘管撇號確實變成了兩個,但這並不起作用。我想知道是否有人可以幫助理解爲什麼。

我對導致問題的場景有兩種想法。

  1. 在autopostback上,它會在javascript更改函數之前觸發,因此在javascript更改之前傳遞原始值以修改它。

  2. 服務器端代碼只理解它最初放置在下拉菜單中的內容,因此無論我操作多少客戶端代碼,它只會看到它放置的內容?

任何人都可以確認這些場景嗎? 幫助將不勝感激!

編輯:我逆向工程的代碼中,是它非常醜陋的(和SQL注射用),但不是我的,我不能修改它

C#代碼

protected void ddls_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (this.ddls.SelectedIndex == 0) 
     { 
      this.pnlA.Visible = false; 
     } 
     else 
     { 
      this.pnlA.Visible = true; 
      string text = Common.GetSql("~/Sql/" + this._Conn + "/PropertyAddressReverseSearch.sql", false, true).Split(new char[] 
      { 
       Conversions.ToChar(this._Delimiter) 
      })[4]; 
      text = string.Concat(new string[] 
      { 
       "SELECT * FROM (", 
       text, 
       ") a WHERE StreetName='", 
       this.ddls.SelectedItem.Text, 
       "' " 
      }); 
      this.Bind(this.ddla, text); 
      this.ddla.Items.Insert(0, new ListItem("I'm not sure of the house number...", Conversions.ToString(-1))); 
      this.ddla.Items.Insert(0, new ListItem("", Conversions.ToString(0))); 
      this.map.Visible = false; 
     } 
    } 

Javscript +控制

<asp:dropdown runat="server" id="ddls" autopostback="true"> 
<script type="javascript/text"> 
    $(document).ready(function() { 
     $("select[id$='adsearch_ddls']").change(function() { 
      var ddlsValue = $("select[id$='adsearch_ddls'] option:selected").text(); 
      ddlsValue = ddlsValue.replace(/'/g,"\'\'"); 
      $("select[id$='adsearch_ddls'] option:selected").text(ddlsValue); 
      return false; 
     }); 
    }); 

</script> 
+0

根據** how **定義自定義事件偵聽器,在回發之前可能會或可能不會觸發它。另外,你提到改變'text' - 提交給服務器的值是'value'。也許你正在改變錯誤的東西。你能顯示你的JS代碼嗎? – Ian

+0

希望我的編輯能夠提供幫助。在選定的索引更改中調用服務器端代碼,將文本放入查詢中而不是值 – Cyassin

回答

0

當啓用viewstate時,您無法修改(或添加/刪除)選擇/下拉列表項目客戶端,並且僅使用ASP.NET Webforms獲取相同的服務器端項目。

除非你以另一種方式在this answer,其中列表項目複製到一個隱藏字段發回修改的項目,例如像:

function SaveList() 
{ 
//Clear the hidden field 
var hField = document.getElementById('<%= YourHiddenField.ClientID %>'); 
hField.value = '' ; 

var selectedList = document.getElementById('<%= YourDropDownList.ClientID %>') 
for(i = 0; i < selectedList.options.length; ++i) 
{   
hField.value = hField.value + ',' + selectedList.options[i].value; 
} 

也就是說,假設「在選擇指數的變化調用服務器端代碼「你的意思是回發被觸發?

禁用ViewState將導致其他問題(如SelectedIndexChanged不觸發等)。

您可以通過自己的(AJAX)回發處理選擇更改。但服務器端和客戶端列表項之間的差異仍然存在。

相關問題