2011-09-15 207 views
5

让我们说,我们有一个对象双向绑定

class Entity 
{ 
    public string ID {get; set;} 
    public string Name {get; set;} 
} 

我想在一个页面像这样绑定属性两个文本框:

<asp:FormView ID="FormView" runat="server"> 
    <ItemTemplate> 
    <asp:textbox ID="TextId" Text='<%# Bind("ID") %>'/> 
    <asp:textbox ID="TextId" Text='<%# Bind("Name") %>'/> 
    </ItemTemplate> 
</asp:FormView> 

,然后写在后面

public EntityObject 
     { 
      get { return ViewState["Entity"] as Entity; } 
      set { ViewState["Entity"] = value; } 
     } 
protected override void OnInit(EventArgs e) 
     { 
      if (EntityObject== null) 
       EntityObject= new EntityObject(); 

      FormView.DataSource = new[] { EntityObject }; 
      FormView.DataBind(); 
      base.OnInit(e); 
     } 

代码当我在文本框中输入值,我期待EntityObject有在性能这些值WH在PostBack后重新加载页面,但属性始终为空。请帮忙,我哪里出错了?

回答

4

伤心地说,但aps.net不支持双向绑定到.NET对象...... 相反,您可以使用的东西像每一个岗位“手工绑定”回(这里AddIncomeSources是RepeaterControl)

 public List<Income> AdditionalIncomeList 
     { 
      get { return ViewState["AdditionalIncome"] as List<Income>; } 
      set { ViewState["AdditionalIncome"] = value; } 
     }     
      foreach (RepeaterItem item in AddIncomeSources.Items) 
      { 
       var amount = (TextBox)item.Controls.Cast<Control>().First(c => c.ID == "Amount"); 
       var document = (DropDownList)item.Controls.Cast<Control>().First(c => c.ID == "Document"); 
       AdditionalIncomeList[item.ItemIndex].Amount = amount.Text.ToDouble(); 
       AdditionalIncomeList[item.ItemIndex].IncomeDocument = document.SelectedValue; 
      } 
      AddIncomeSources.DataSource = AdditionalIncomeList; 
      AddIncomeSources.DataBind(); 
0

在OnInit你总是会为null ..删除这些代码,并保持在页面加载..

只需要在第一次在所有的岗位绑定不回来。

的Page_Load(){

if(!Page.IsPostBack) 
{ 
    if (EntityObject== null) 
      EntityObject= new EntityObject(); 

     FormView.DataSource = new[] { EntityObject }; 
     FormView.DataBind(); 
} 

}

+0

,这似乎是有帮助的,现在输入的数值保持回发后,但是当我访问EntityObject它stiil都空 – Alexander

+0

看看我的上述评论和尝试与.. ..希望那些帮助.. –

0

这里的问题是,你正在试图创建dynami c控制。

您可以使用.aspx页面中GridView控件并绑定数据时,它在默认情况下,而不是你拥有的视图状态..

反正网络是无状态的,我们应该通过ViewState中或会话或应用程序保留数据。你也可以将它保存在缓存中,但不可靠(我们可以使它更实用可靠)。大多数.NET控件都内置了ViewState。

+0

因为我知道gridview适合显示和编辑数据表示为DataTable在底层数据源中的行,但我需要显示某种形式必须绑定到buisness对象,这是不支持的导致web是无状态的) – Alexander

0

对于那些看,我做了这个JavaScript插件。它的数据绑定非常接近WPF的功能,并且易于使用。它连接文档.txt文件

https://github.com/jdemeuse1204/ObjectDataBinding

这里是什么我绑定一个看起来像

<input runat="server" class="popoutEditInput" style="width: 50px;" data-bind="path: Quote" /> 

要激活调用

$("#yourelementname").observe(yourobject, 'yourbindingname'); 

为了得到一个例子用于保存或其他操作的对象返回

var object = $("#yourelementname").getObserveObject('yourbindingname');