1

我有一个页面,其中有一个 FormPanel(里面有一个 ComboBox)和一个 TreePanel(有一个默认的根节点),然后打开 ViewState。

我在 GET 中为 ComboBox 设置了一个值。

当我获取页面时,TreePanel 的商店在 FormPane 在客户端呈现之前发送一个 POST 请求(存储读取),在这个 POST 请求中,fromdata 没有关于 FormPane 的信息。

在 POST 请求中从 ViewState 中恢复 ComboBox.Value,但在 ComboBoxBase.LoadPostData() Ext.Net 中从 formdata 中获取值并覆盖 ComboBox.Value 而没有先决条件

这是 ComboBoxBase.LoadPostData() 代码

protected override bool LoadPostData(string postDataKey, NameValueCollection postCollection)
   {
       this.HasLoadPostData = true;

       string text = postCollection[this.UniqueName];
       string state = postCollection[this.ValueHiddenName.IsNotEmpty() ? this.ValueHiddenName : ("_" + this.UniqueName + "_state")];

       this.SuspendScripting();
       this.RawValue = text;
       this.Value = text;
       this.ResumeScripting();

       if (state == null && text == null)
       {
           return false;
       }

       if (!this.EmptyText.Equals(text) && text.IsNotEmpty())
       {
           List<ListItem> items = null;
           if (this.SimpleSubmit)
           {
               var array = state.Split(new char[] { ',' });
               items = new List<ListItem>(array.Length);
               foreach (var item in array)
               {
                   items.Add(new ListItem(item));
               }                    
           }
           else if(state.IsNotEmpty())
           {
               items = ComboBoxBase.ParseSelectedItems(state);
           }

           bool fireEvent = false;

           if (items == null)
           {
               items = new List<ListItem> 
               { 
                   new ListItem(text)
               };                    

               /*fireEvent = this.SelectedItems.Count > 0;
               this.SelectedItems.Clear();
               return fireEvent;
               */
           }

           foreach (var item in items)
           {
               if (!this.SelectedItems.Contains(item))
               {
                   fireEvent = true;
                   break;
               }
           }

           this.SelectedItems.Clear();
           this.SelectedItems.AddRange(items);

           return fireEvent;
       }
       else
       {
           if (this.EmptyText.Equals(text) && this.SelectedItems.Count > 0)
           {
               this.SelectedItems.Clear();

               return true;
           }
       }

       return false;
   }

看看5到11号线,为什么不改成这样

string text = postCollection[this.UniqueName];
        string state = postCollection[this.ValueHiddenName.IsNotEmpty() ? this.ValueHiddenName : ("_" + this.UniqueName + "_state")];

       this.SuspendScripting();
       this.RawValue = text;
       this.ResumeScripting();

       if (state == null && text == null)
       {
           return false;
       }

       this.SuspendScripting();
       this.Value = text;
       this.ResumeScripting();

此问题的示例

页面文件

  <html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <ext:ResourceManager ID="ResourceManager1" runat="server" DisableViewState="false"
        AjaxViewStateMode="Enabled"  ViewStateMode="Enabled"/>
    <form id="form1" runat="server">
    <ext:Viewport runat="server" ID="VP">
    </ext:Viewport>
    </form>
</body>
</html>

.cs 文件

public partial class WebFormTest : System.Web.UI.Page
{
    protected override void OnInitComplete(EventArgs e)
    {
        FP = new FormPanel();
        FP.ID = "FP";
        FP.Title = "FP";
        FP.Region = Region.Center;

        TF = new TextField();
        TF.ID = "TF";
        TF.FieldLabel = "TF";

        CB = new ComboBox();
        CB.ID = "CB";
        CB.FieldLabel = "CB";
        CB.Items.Clear();
        CB.Items.Add(new ListItem("one", "1"));
        CB.Items.Add(new ListItem("two", "2"));

        Button test = new Button() { ID = "testbtn", Text = "test" };
        test.Listeners.Click.Handler = "App.Store2.load()";
        FP.TopBar.Add(new Toolbar() { Items = { test } });

        FP.Items.Add(TF);
        FP.Items.Add(CB);

        GP = new GridPanel();
        GP.ID = "GP";
        GP.Title = "GP";
        GP.Region = Region.East;

        GP.Listeners.BeforeRender.Handler = "App.Store1.reload()";

        BTN = new Button();
        BTN.ID = "BTN";
        BTN.Text = "click";
        BTN.Icon = Icon.ArrowJoin;
        BTN.DirectEvents.Click.Event += new ComponentDirectEvent.DirectEventHandler(Click);

        TB = new Toolbar();
        TB.Items.Add(BTN);

        GP.TopBar.Add(TB);

        Store1 = new Store();
        Store1.ID = "Store1";
        Store1.ReadData += new Store.AjaxReadDataEventHandler(WebFormTest_ReadData);

        Model1 = new Model();
        Model1.ID = "Model1";

        Store1.Model.Add(Model1);

        GP.Store.Add(Store1);

        TP = new TreePanel();
        TP.ID = "TP";
        TP.Title = "TP";
        TP.Region = Region.East;
        TP.RootVisible = false;
        TP.Root.Add(new Node() { NodeID = "test", Text = "test" });

        Store2 = new TreeStore();
        Store2.ID = "Store2";
        Store2.ReadData += new TreeStoreBase.ReadDataEventHandler(Store2_ReadData);

        TP.Store.Add(Store2);

        VP.Items.Add(FP);

        //VP.Items.Add(GP);

        VP.Items.Add(TP);

        if (!X.IsAjaxRequest)
        {
            CB.Value = "2";
            TF.Value = "TEXT";
        }
        base.OnInitComplete(e);
    }

    FormPanel FP;
    TextField TF;
    ComboBox CB;
    GridPanel GP;
    Button BTN;
    Toolbar TB;
    Store Store1;
    Model Model1;
    TreePanel TP;
    TreeStore Store2;
    protected override void CreateChildControls()
    {


        base.CreateChildControls();
    }


    void Store2_ReadData(object sender, NodeLoadEventArgs e)
    {

    }


    protected void Page_Load(object sender, EventArgs e)
    {
        //if (!X.IsAjaxRequest)
        //{
        //    this.Store1.DataSource = this.Data;
        //    this.Store1.DataBind();

        //}

    }



    protected void Refresh(object sender, DirectEventArgs e)
    {

    }

    bool flag = false;
    protected void Click(object sender, DirectEventArgs e)
    {
        GP.GetStore().Reload();
        flag = true;
    }

    protected override void OnPreRender(EventArgs e)
    {
        if (flag)
        {
            TF.Value = "asdasd";
        }
        base.OnPreRender(e);
    }

    protected void WebFormTest_ReadData(object sender, StoreReadDataEventArgs e)
    {

    }

    private object[] Data
    {
        get
        {
            return new object[]
        {
            new object[] { "3m Co", 71.72, 0.02, 0.03, "9/1 12:00am" },
        };
        }
    }
}

您也可以在Ext.net 论坛中讨论

4

1 回答 1

0

我们将更改提交到 SVN 主干。它将进入下一个版本(v2.3)。

更改与您的更改类似,但我们决定也不更改 RawValue。感谢您的报告和建议的修复。

修复(ComboBoxBase LoadPostData)

protected override bool LoadPostData(string postDataKey, NameValueCollection postCollection)
{
    this.HasLoadPostData = true;

    string text = postCollection[this.UniqueName];
    string state = postCollection[this.ValueHiddenName.IsNotEmpty() ? this.ValueHiddenName : ("_" + this.UniqueName + "_state")];

    if (state == null && text == null)
    {
        return false;
    }

    this.SuspendScripting();
    this.RawValue = text;
    this.Value = text;
    this.ResumeScripting();
于 2013-05-07T03:35:37.010 回答