gpt4 book ai didi

c# - 在 ASP.NET 自动回发之前更改下拉项目文本

转载 作者:行者123 更新时间:2023-11-28 08:26:17 25 4
gpt4 key购买 nike

我正在接手一个项目,其中客户遇到了一些烦人的问题。他们有一个下拉列表,可以在更改时自动回发以将所选文本放入 t-sql 查询中。任何带有撇号的值都会由于未转义而导致查询错误

我无权访问已编译的代码,但希望在发布将撇号替换为双撇号以在进入查询时转义它之前,对选定的更改编写一个快速的创可贴修复。

我编写了一个 javscript ddl.change 函数,用于更改文本。

然而,即使撇号确实变成了两个,这也不起作用。我想知道是否有人可以帮助理解原因。

对于导致该问题的场景,我有两种想法。

  1. 在自动回发中,它在 javascript 更改函数之前触发,因此在 javascript 进行更改之前传递原始值以对其进行修改。

  2. 服务器端代码只能理解它最初放入下拉列表中的内容,因此无论我如何操作客户端代码,它都只能看到它放入的内容?

任何人都可以确认这两种情况吗?帮助将不胜感激!

编辑:我对代码进行了逆向工程,是的,它非常丑陋(并且可注入(inject) 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>

最佳答案

当启用 View 状态时,您无法使用 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) 回发来处理选择更改。但服务器端和客户端列表项之间的差异仍然存在。

关于c# - 在 ASP.NET 自动回发之前更改下拉项目文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22369338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com