2011-09-15 31 views
5

Hãy nói rằng chúng tôi có một đối tượngHai cách databinding trong ASP.NET

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

tôi muốn để ràng buộc tính đến hai textbox trên một cái gì đó trang như thế này:

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

và sau đó viết này trong mã phía sau

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); 
     } 

Và khi tôi nhập giá trị vào hộp văn bản tôi mong đợi EntityObject có các giá trị này trong thuộc tính wh vi trang tải lại sau khi PostBack, nhưng các thuộc tính luôn rỗng. Xin vui lòng giúp đỡ, nơi tôi đang đi sai?

Trả lời

4

buồn bã nói rằng, nhưng aps.net không hỗ trợ hai chiều liên kết với các đối tượng .net ... thay vào đó bạn có thể sử dụng một cái gì đó như "liên kết thủ công" trên mỗi bài đăng lại (tại đây AddIncomeSources là 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

Trong OnInit bạn luôn được làm null .. loại bỏ những mã và giữ trong tải trang ..

chỉ cần để ràng buộc trong thời gian đầu tiên không phải trong tất cả các bài sau.

Page_Load() {

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

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

}

+0

rằng có vẻ là hữu ích, giá trị hiện nay vào giữ sau khi postback, nhưng khi tôi truy cập EntityObject nó stiil có tất cả null – Alexander

+0

nhìn vào bình luận trên của tôi và hãy thử với điều đó .. hy vọng những điều đó giúp .. –

0

đây là vấn đề là bạn đang cố tạo dynami c kiểm soát.

bạn có thể sử dụng một điều khiển GridView trong trang .aspx và ràng buộc dữ liệu, nó có ViewState theo mặc định thay vì bạn ..

Dù sao web là quốc tịch, chúng ta nên giữ lại các dữ liệu thông qua ViewState hoặc Session hay Application. Ngoài ra, bạn có thể giữ nó trong bộ nhớ cache nhưng không đáng tin cậy (chúng tôi có thể làm cho nó thực tế đáng tin cậy). Hầu hết các điều khiển .NET có ViewState trong xây dựng.

+0

như tôi biết GridView phù hợp để hiển thị và chỉnh sửa các hàng dữ liệu đại diện như DataTable trong nguồn dữ liệu cơ bản, nhưng tôi cần hiển thị một số loại biểu mẫu phải được ràng buộc với đối tượng kinh doanh và đây là không được hỗ trợ gây ra web là không trạng thái) – Alexander

0

Đối với những người đang tìm kiếm, tôi đã tạo plugin javascript này. Nó liên kết dữ liệu rất gần với những gì WPF thực hiện và dễ sử dụng. Nó đã gắn tài liệu trong một file .txt

https://github.com/jdemeuse1204/ObjectDataBinding

Dưới đây là một ví dụ về những gì một trong những cam kết ràng buộc của tôi trông giống như

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

Để kích hoạt bạn gọi

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

Để có được đối tượng quay lại để lưu hoặc các hoạt động khác

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