动态用户控件在回发后获取并维护值

Bry*_*sby 5 c# asp.net user-controls

我有一个我已经构建的页面,它动态生成用户控件.例如,用户控件有两个可以编辑的字段:SomeId和SomeData.我希望能够基于a设置这些值UserControlObject.当我之后读取控件时,我希望能够UserControlObject从控件返回一个并将数据库值设置为该值.我在使值保持最新状态时遇到一些麻烦.

//Page
public class SomePage
{
    private List<MyUserControl> _MyUserControls;

    private void InitControls()
    {
      var controlsToBuild = SomeDatabaseCallToGetControlObjects();

          foreach(MyUserControl control in controlsToBuild)
          {
        MyUserControl control = this.Page.LoadControl("MyControl.ascx") as MyUserControl;

          UserControlPlaceHolder.Controls.Add(myControl);
          _MyUserControls.Add(myControl);
      }
    }

    protected void Page_Init(object sender, EventArgs e)
    {
       InitControls();
    }

    protected void SaveButton_Click(object sender, EventArgs e)
    {
      if (this.IsValid)
      {
        List<MyUserObject>listObj = new List<MyUserObject>();
        foreach(MyUserControl control in _MyUserControls)
        {
           MyUserObject obj = control.GetObjectFromControl();
           listObjs.Add(obj);
        }
        SaveToDatabase(listObjs);
        //Clear placeholder in case number of controls has changed based on the save
        UserControlPlaceHolder.Clear();
        InitControls();
        GetObjectFromDatabase();
      }
    }

}

//Object to put in control
public class UserControlObject
{
    public string DataForUser { get;set;}
    public double MoreDataForUser { get;set;}
    public int HiddenIdFromUser { get; set;}
}


//User control
public class MyUserControl : UserControl
{

  public MyUserControlObject GetObjectFromControl()
  {
     UserControlObject obj = new UserControlObject();
     obj.DataForUser = textBoxOnTheControl.Text;
     obj.MoreDataForUser = anotherBoxOnTheControl.Text;
     obj.HiddenIdFromUser = hiddenField.Value;

     return obj;
  }

  public void SetUserControlObject(UserControlObject obj)
  {
     textBoxOnTheControl.Text = obj.DataForUser;
     anotherBoxOnTheControl.Text = obj.MoreDataForUser;
     hiddenField.Value = obj.HiddenIdFromUser;
  }
}
Run Code Online (Sandbox Code Playgroud)

基本上,我想MyUserControl用数据库中的值加载每个值.用户应该能够更改这些字段中的大多数(但不是全部).用户不应该能够更改ID,但我需要它来更新数据库中的记录.

我在获取信息以保存并正确保存方面遇到一些麻烦,因为我正在重新创建一个集合MyUserControl.它似乎在初始回发上工作正常,但在随后的回发后,我仍然得到其中一个字段的旧值.我怎样才能确保:

1)信息正确地设置到用户控件.我是否需要在UserControl的每个属性上放置一个引用viewstate的公共属性?

2)点击保存事件后,在回发后,重建控件不会导致我保留初始加载中的任何"旧"值?我该如何处理视图状态?我希望数据反映用户已更改的内容.

Vin*_*ayC 9

要使视图状态/控件状态正常工作,您的控件必须具有相同的ID.由于您没有明确地分配ID,因此必须生成它,并且存在与多个用户控件存在的冲突.我会建议你有一些逻辑来通过post-back生成相同的ID集.例如,

private void InitControls()
{
  var numControlsToBuild = SomeDatabaseCallToGetNumControls();
  int idCounter = 1;
  foreach(var controlData in numControlsToBuild)
  {
    var control = this.Page.LoadControl("MyControl.ascx") as MyUserControl;
    control.ID = "MyControl" + idCounter.ToString();
    idCounter++;
    UserControlPlaceHolder.Controls.Add(myControl);
    _MyUserControls.Add(control);

    // probably code load control data into control
  }
}
Run Code Online (Sandbox Code Playgroud)