0

ページでASP.NETオートコンプリートを使用したい。データの読み込みに内部オブジェクトを使用しています。オートコンプリートは、インスタンスページフィールド値であるパラメーターを使用してクエリする必要があります。静的オートコンプリートエクステンダーメソッドでインスタンスフィールドを使用できないため、目標を達成するために使用できるコードのサンプルを見つけました。

asp.netページにテキストボックスとオートコンプリートエクステンダーがあります。

<asp:TextBox ID="PurchaseOrderItemsSearchTextBox" runat="server" EnableViewState="False"
                            SkinID="SalesReturnTextBox" AutoCompleteType="Disabled" 
                            AutoPostBack="True" OnTextChanged="PurchaseOrderItemsSearchTextBoxTextChanged" 
                            onload="PurchaseOrderItemsSearchTextBoxLoad" />
<ajax:AutoCompleteExtender runat="server" TargetControlID="PurchaseOrderItemsSearchTextBox" ID="OrderOrStockNumberExtender"
                            ServiceMethod="GetOrderOrStockNumbers" MinimumPrefixLength="2" CompletionInterval="1000" UseContextKey="True"/>

PurchaseOrderItemsSearchTextBoxLoadメソッドで、上記の例に従ってjavascriptを介してコンテキストキーを動的に設定したいと思います。

protected void PurchaseOrderItemsSearchTextBoxLoad(object sender, EventArgs e)
    {
        var textBox = sender as TextBox;
        if (textBox!=null)
        {                
            string sapCode = Customer.Company.SapCode;
            const string PURCHASE_ORGANIZATION = PURCHASE_ORGANIZATION_HP;
            string purchaseGroup = string.Empty;
            string firstDateTime = FirstDateTextBox.Text;
            const string SEPARATOR = "#";
            var contextStrings = new[]{sapCode,PURCHASE_ORGANIZATION,purchaseGroup,firstDateTime};
            string context =string.Join(SEPARATOR, contextStrings);
            const string ON_KEY_UP = "onkeyup";
            string attributevalue = "$find('" + OrderOrStockNumberExtender.ClientID + "').set_contextKey(" + context +
                                    ");";
            textBox.Attributes.Add(ON_KEY_UP, attributevalue);
        }
    }

しかし、ページを実行し、文字列配列を返す静的Webメソッドにブレークポイントを設定すると、contextKeyがnullであることがわかります。

[WebMethod]
[ScriptMethod]
public static string[] GetOrderOrStockNumbers(string prefixText,int count, string contextKey)
{            
    string[] returnStrings = new string[] {"1","2"};
    return returnStrings;
}

有益な回答をありがとうございました、

ルドルフ。

4

2 に答える 2

2

これらはどれも機能しませんでしたが、ページの読み込み時にコードビハインドでコンテキストキーを設定できることがわかりました

ExtenderID.ContextKey = Control.SelectedValue;

そしてそれは動作します...

于 2020-11-13T02:33:14.653 に答える
0

私は解決策を見つけました。この記事で見つけたように、.Net 4.0は属性値のアポストロフィをエスケープするため、属性値によって設定されたContextKeyはASP.NETでは機能しませんでした。

1つの解決策は、Web構成で属性値のエンコードを無効にすることですが、セキュリティ上の問題が発生する可能性があります。

<httpRuntime encoderType="HtmlAttributeEncodingNot"/>

アプローチを変更し、属性ごとにcontextKey値を設定しませんでしたが、テキストボックスコントロールの事前レンダリングイベントにクライアントスクリプトを登録しました。

protected void PurchaseOrderItemsSearchTextBoxPreRender(object sender, EventArgs e)
    {
        var textBox = sender as TextBox;
        if (textBox != null)
        {
            string sapCode = Customer.Company.SapCode;
            const string PURCHASE_ORGANIZATION = PURCHASE_ORGANIZATION_HP;
            string purchaseGroup = string.Empty;
            string firstDateTime = FirstDateTextBox.Text;
            var contextStrings = new[] {sapCode, PURCHASE_ORGANIZATION, purchaseGroup, firstDateTime};
            string context = string.Join(SEPARATOR, contextStrings);
            const string ON_KEY_UP = "onkeyup";
            const string ON_KEY_UP_VALUE = "SetOrderOrStockExtenderContextKey();";
            textBox.Attributes.Add(ON_KEY_UP, ON_KEY_UP_VALUE);

            //disable autocomplete in firefox
            DisableAutocompleteInFirefox(textBox);

            const string ORDER_OR_STOCK_NUMBER_SCRIPT_KEY = "OrderOrStockNumberScript";
            if (!ClientScript.IsClientScriptBlockRegistered(ORDER_OR_STOCK_NUMBER_SCRIPT_KEY))
            {
                Type type = GetType();
                var scriptTextBuilder = new StringBuilder();
                const string FUNCTION_NAME = "function SetOrderOrStockExtenderContextKey()";
                scriptTextBuilder.AppendLine(FUNCTION_NAME);
                const string LEFT_BRACKET = "{";
                scriptTextBuilder.AppendLine(LEFT_BRACKET);
                const string FIND_COMMAND = "$find(\'";
                scriptTextBuilder.Append(FIND_COMMAND);
                scriptTextBuilder.Append(OrderOrStockNumberExtender.ClientID);
                const string SET_COTEXT_KEY = "\').set_contextKey('";
                scriptTextBuilder.Append(SET_COTEXT_KEY);
                scriptTextBuilder.Append(context);
                const string END_OF_COMMAND = "');";
                scriptTextBuilder.AppendLine(END_OF_COMMAND);
                const string RIGHT_BRACKET = "}";
                scriptTextBuilder.AppendLine(RIGHT_BRACKET);

                string setContextKeyFunction = scriptTextBuilder.ToString();

                ClientScript.RegisterClientScriptBlock(type, ORDER_OR_STOCK_NUMBER_SCRIPT_KEY, setContextKeyFunction,
                                                       true);
            }
        }
    }

これで、contextKeyがJavascriptによって適切に設定され、GetOrderOrStockNumbersメソッドでその値を使用できるようになりました。

于 2012-09-12T15:46:31.133 に答える