Двусторонняя привязка данных в 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 ответов:
Печально это говорить, но 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');
Я создал решение для этого.
Https://www.codeproject.com/Articles/146078/WPF-Two-way-Databinding-in-ASP-NET-Enabling-MVVM
Или github: