簡體   English   中英

ASP.NET中的雙向數據綁定

[英]Two way databinding in ASP.NET

假設我們有一個對象

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在PostBack之后重新加載頁面時在屬性中包含這些值,但屬性始終為null。

遺憾的是,但ASP.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();

對於那些看起來,我做了這個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');

在OnInit中,你總是使其為null ..刪除那些代碼並保持在頁面加載..

只需要在第一次綁定而不是在所有的帖子中。

Page_Load(){

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

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

}

這里的問題是你正在嘗試創建動態控件。

你可以在.aspx頁面中使用gridview控件並綁定數據,默認情況下它是viewstate而不是你的..

無論如何,web是無狀態的,我們應該通過ViewState或Session或Application保留數據。 你也可以將它保存在緩存中但不可靠(我們可以使它在實用上可靠)。 大多數.NET控件都內置了ViewState。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM