我接手一个客户有一些烦人问题的项目。 他们有一个下拉列表,可以自动进行更改,将所选文本放入t-sql查询中。具有撇号的任何值都会因未被转义而导致查询错误
我无法访问已编译的代码,但希望在选择更改之前编写一个快速创可贴修复,然后将撇号替换为双撇号,以便在查询时将其删除。
我编写了一个javscript ddl.change函数,用于更改文本。
然而,即使撇号确实变为两个,这也不起作用。我想知道是否有人能帮助理解原因。
我对导致问题的情景有两种想法。
在autopostback上,它会在javascript更改函数之前触发,因此在javascript更改之前传递原始值以进行修改。
服务器端代码只能理解它最初放入下拉列表中的内容,因此无论我操作客户端代码多少,它只会看到它放置的内容?
任何人都可以确认这些情况吗? 帮助将不胜感激!
编辑:我反思工程师的代码,是非常的(和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 + Control
<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 :(得分:0)
您无法修改(或添加/删除)客户端的选择/下拉列表项,只需在启用了视图状态时使用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;
}
也就是说,假设通过&#34; On选择索引更改调用服务器端代码&#34;你的意思是触发了回发?
禁用ViewState会导致其他问题(例如SelectedIndexChanged不会触发等)。
您可以通过自己的(AJAX)回发来处理选择更改。但服务器端和客户端列表项之间的差异仍然存在。