Двухстороннее связывание данных в ASP.NET - PullRequest
6 голосов
/ 15 сентября 2011

Допустим, у нас есть объект

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, но свойства всегда равны нулю.

Ответы [ 5 ]

6 голосов
/ 16 сентября 2011

К сожалению, это так, но 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();
0 голосов
/ 14 сентября 2017
0 голосов
/ 06 августа 2014

Для тех, кто ищет, я сделал этот плагин 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');
0 голосов
/ 21 сентября 2011

здесь проблема в том, что вы пытаетесь создать динамическое управление.

Вы можете использовать элемент управления gridview на странице .aspx и связывать данные, по умолчанию он имеет viewstate вместо вашего ..

В любом случае, веб не имеет статуса, мы должны сохранять данные через ViewState, Session или Application. Также вы можете хранить его в кеше, но не надежным (мы можем сделать его прагматически надежным). Большинство элементов управления .NET имеет встроенный ViewState.

0 голосов
/ 15 сентября 2011

В OnInit вы всегда пытаетесь обнулить .. удалите этот код и сохраняйте загрузку страницы ..

нужно связывать только в самый первый раз, а не во всех постах назад.

Page_Load () {

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

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

}

...