在asp.net autopostback之前更改下拉项目文本

时间:2014-03-13 04:52:03

标签: c# javascript jquery asp.net vb.net

我接手一个客户有一些烦人问题的项目。 他们有一个下拉列表,可以自动进行更改,将所选文本放入t-sql查询中。具有撇号的任何值都会因未被转义而导致查询错误

我无法访问已编译的代码,但希望在选择更改之前编写一个快速创可贴修复,然后将撇号替换为双撇号,以便在查询时将其删除。

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

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

我对导致问题的情景有两种想法。

  1. 在autopostback上,它会在javascript更改函数之前触发,因此在javascript更改之前传递原始值以进行修改。

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

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

    编辑:我反思工程师的代码,是非常的(和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>
    

1 个答案:

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