0

2 つの問題があります。aspx ページには、データベース テーブルから各データを取得する 3 つの RadioButtonLists (別名 RBL) があります。任意の RBL を選択すると、同じページへのポストバックが発生し、その特定の RBL の値がクエリ文字列に入力され、ListView が検索して、クエリ文字列に基づいて製品を除外します。リストビューは、クエリ文字列を読み取り、リストを適切にフィルタリングすると正常に機能します。

問題 1 - ポストバックで、3 つの RBL のいずれかから選択した値が、ページの読み込み時に選択されません。したがって、ページにデフォルト値が設定されていても、すべての RBL には値がありません。選択した RBL で選択した値でページをリロードするにはどうすればよいですか?

問題 2 - クエリ文字列を更新する代わりに、他の 2 つの RBL のいずれかを選択すると、再度ポストバックするときに最初の値が消去されます。したがって、RBL-1 で何かを選択すると、その特定のフィールドがクエリ文字列で更新されてポストバックされますが、RBL-2 で何かを選択すると、RBL-2 からの値のみがポストバックされ、値が消去されます。 RBL-1 から選んだものです。以前の選択をクエリ文字列に保持しながら、ページをロードするにはどうすればよいですか?

ASPX code:
        <p>Normally Open or Closed:<asp:RadioButtonList ID="RadioButtonList1" runat="server" EnableViewState="true" 
                AutoPostBack="true" DataSourceID="NormalitySDS" DataTextField="Op"
                DataValueField="Op" onselectedindexchanged="RadioButtonAllLists_SelectedIndexChanged">
            </asp:RadioButtonList>
            <asp:SqlDataSource ID="NormalitySDS" runat="server" 
                ConnectionString="<%$ 005 %>" 
                SelectCommand="SELECT DISTINCT [Op] FROM [Matrix] ORDER BY [Op]">
            </asp:SqlDataSource>
        </p>
        <p>Sizes:<asp:RadioButtonList ID="RadioButtonList2" runat="server" EnableViewState="true" 
                AutoPostBack="True" DataSourceID="SizesSDS" DataTextField="SIZE" RepeatColumns="2" 
                DataValueField="SIZE" onselectedindexchanged="RadioButtonAllLists_SelectedIndexChanged">
            </asp:RadioButtonList>
            <asp:SqlDataSource ID="SizesSDS" runat="server" 
                ConnectionString="<%$ 005 %>" 
                SelectCommand="SELECT DISTINCT [SIZE] FROM [Matrix] ORDER BY [SIZE]">
            </asp:SqlDataSource>
        </p>
        <p>Body:<asp:RadioButtonList ID="RadioButtonList3" runat="server" EnableViewState="true" 
                AutoPostBack="True" DataSourceID="BodySDS" DataTextField="Body" 
                DataValueField="Body" OnSelectedIndexChanged="RadioButtonAllLists_SelectedIndexChanged">
            </asp:RadioButtonList>
            <asp:SqlDataSource ID="BodySDS" runat="server" 
                ConnectionString="<%$ 005 %>" 
                SelectCommand="SELECT DISTINCT [Body] FROM [Matrix] ORDER BY [Body]">
            </asp:SqlDataSource>
      <SelectParameters>
                    <asp:QueryStringParameter DefaultValue="NC" Name="Op" QueryStringField="Op" Type="String" />
                    <asp:QueryStringParameter DefaultValue="0.25" Name="Sz" QueryStringField="Sz" Type="String" />
                    <asp:QueryStringParameter DefaultValue="304" Name="Body" QueryStringField="Body" Type="String" />
      </SelectParameters>

分離コード:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Configurator
{
    public partial class Product_Config_Full_wQuery : System.Web.UI.Page
    {
        string BaseUrl = "/Product_Config_Full_wQuery.aspx";
        string op;
        string op2;
        string sz;
        string body;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                op = (Server.UrlDecode(Request.QueryString["op"] ));
                RadioButtonList1.SelectedIndex = op2;
                RadioButtonList1.DataBind();


                sz = Server.UrlDecode(Request.QueryString["sz"]);
                body = Server.UrlDecode(Request.QueryString["body"]);
            }
        }


        // Combining all actions into a single protected-event
        protected void RadioButtonAllLists_SelectedIndexChanged(object sender, EventArgs e)
        {
            op = RadioButtonList1.SelectedValue.ToString();
            sz = RadioButtonList2.SelectedValue.ToString();
            body = RadioButtonList3.SelectedValue.ToString();

            if (op != null)
            {
                BaseUrl += "?Op=" + op + "&";
            }
            //else op = "NC";

            if (sz != null)
            {
                BaseUrl += "Sz=" + sz + "&";
            }

            if (body != null)
            {
                BaseUrl += "Body=" + body + "&";
            }
            Response.Redirect(string.Format(BaseUrl, Server.UrlEncode(op), Server.UrlEncode(sz), Server.UrlEncode(body)));
        }
4

2 に答える 2

0

ラジオ ボタン リスト内の値を動的に設定しているため、ページがこれらのコントロールに設定する値は、実際にはポストバックにはありません (データ ソースが実際に取得する前に、ページ ライフサイクルがこれらのコントロールに値を設定しようとします)。可能な値を取得し、それらの項目をコントロール自体に追加します)。

また、クエリ文字列を使用してポストバック値を保持するのをやめます。本当に必要な場合は、情報を保持するためにいくつかの HiddenFields を設定します。それらはポストバックを通じて保持され、奇妙なクエリ文字列の問題について心配する必要はありません。

于 2013-05-02T22:00:47.777 に答える
0

私は自分の問題を修正するために使用したコードを投稿することにしました。約 10 の異なる Web サイト ソースといくつかの試行錯誤に基づいています。

    public partial class Bla zay blaz : System.Web.UI.Page
{


    string BaseUrl = "/blahblah.aspx?";
    string op;

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            op = Server.HtmlDecode(Request.QueryString["op"]);
            if (op == null)
                op = "A";
            RadioButtonList1.SelectedValue = op;
}

    protected void RadioButtonChanged(object sender, EventArgs e)
    {
        op = RadioButtonList1.SelectedValue;
        if (op == null)
            op = "NC";

        if (op != "A")
            BaseUrl += "Op=" + op + "&";
Response.Redirect(string.Format(BaseUrl, Server.HtmlEncode(op));
}

}
于 2013-06-13T14:21:13.027 に答える