0

検索結果に表示される値に基づいて、いくつかの値を指定できる汎用のSearchUserControlを作成しようとしています。ただし、現在、値の結果を表示しようとしています。これらは常にデフォルト値として表示されます。

私のUserControlコード:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ProductSearch.ascx.cs" Inherits="..." %>
<asp:Label ID="lblSearchWord" runat="server" />
<asp:Label ID="lblSearch" runat="server" />

コードビハインド:

private string _searchWord = string.Empty;
private int _search = -1;
public string SearchWord
      {
         get { return _searchWord; }
         set { _searchWord = value; }
      }

      public int Search
      {
         get { return _search; }
         set { _search = value; }
      }
protected void Page_Load(object sender, EventArgs e)
      {
         lblGroupId.Text = LevelId.ToString();
         lblSearchWord.Text = SearchWord;
}

aspx.csのメインページで検索ボタンを押すと、次のようになります。

 protected void btnSearch_Click(object sender, EventArgs e)
      {
          ucPS.SearchWord = txtProductSearch.Text;
          ucPS.Search = 1
}

私のaspxページには次のものが含まれています

<%@ Register src="UserControls/ProductSearch.ascx" tagname="ProductSearch" tagprefix="ps" %>
<ps:ProductSearch id="ucPS" runat="server" />

私の問題は、ユーザーがこのページで状態を維持する必要がある他のいくつかのものを選択した可能性があるため、クエリ文字列を使用できないことですが、それをテストして機能するようにしました。

どこが間違っているのですか?または、より良い代替手段があります(クエリ文字列を除く)。

4

2 に答える 2

3

ページ内のすべての変数は、ページライフサイクルの最後に破棄されます。したがってSearchWord、すべてのポストバックで常にデフォルト値で初期化されます。

変数など、他の場所に永続化する必要がありViewStateます。

public string SearchWord
{
    get
    {
        if (ViewState["SearchWord"] == null)
            return "";
        else
            return (String)ViewState["SearchWord"];
    }
    set { ViewState["SearchWord"] = value; }
}

ASP.NETアプリケーションで永続的なユーザー状態を管理するための9つのオプション

于 2012-05-16T14:56:04.783 に答える
3
public string SearchWord
{
    get
    {
        if (ViewState["SearchWord"] == null)
           ViewState["SearchWord"] = string.Empty;

        return ViewState["SearchWord"];
    }
    set
    {
        ViewState["SearchWord"] = value;
    }
}

そして、私はpageloadではなくdatabindを使用します。これにより、ユーザーコントロールを呼び出さない限り、ユーザーコントロールは読み込まれません。

protected override DataBind()
{
     //you can add a condition here if you like
     if(SearchWord != string.Empty)
        lblSearchWord.Text = SearchWord;
}

これをaspxから呼び出すには:

usercontrol.SearchWord = "my word";
usercontrol.DataBind();

以上です..

于 2012-05-16T15:06:14.677 に答える