2014-03-13 48 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)回发处理选择更改。但服务器端和客户端列表项之间的差异仍然存在。

相关问题