Двусторонняя привязка данных в 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 будет иметь эти значения в свойствах, когда страница перезагружается после обратной передачи, но свойства всегда равны нулю. Пожалуйста, помогите, где я ошибаюсь?

5 6

5 ответов:

Печально это говорить, но 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();

В OnInit вы всегда делаете null.. удалите этот код и сохраните загрузку страницы..

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

Page_Load() {

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

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

}

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

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

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

Для тех, кто ищет, я сделал этот 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');