2011-09-15 13 views
5

Let dire che abbiamo un oggettobidirezionale associazione dati in ASP.NET

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

voglio associare le proprietà di due caselle di testo su una pagina simile a questa:

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

e poi scrivere questo in codice dietro

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

E quando entro valori nella caselle di testo mi aspetto EntityObject di avere questi valori nelle proprietà wh la pagina si ricarica dopo PostBack, ma le proprietà sono sempre nulle. Per favore aiuto, dove sto andando male?

risposta

4

tristemente a dire che, ma aps.net non supporta due vie legame con oggetti .NET ... invece si può usare qualcosa come "vincolante manuale" su ogni palo (qui 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

Nella OnInit si stanno facendo sempre a null .. rimuovere quelli codice e mantenere nel caricamento della pagina ..

solo bisogno di impegnare in prima volta non in tutti secondo palo.

Page Load() {

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

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

}

+0

che sembra essere utile valori, ora inseriti continua dopo il postback, ma quando accedo EntityObject si stiil avere tutti i null – Alexander

+0

un'occhiata alle mie osservazioni di cui sopra e provare con quello .. spero che quelli li aiuti .. –

0

qui il problema è che si sta cercando di creare dinamicamente controllo c.

è possibile utilizzare un controllo GridView nella pagina aspx e associare i dati, ha ViewState di default al posto del tuo ..

Comunque web è senza stato, dovremmo conservare i dati attraverso ViewState o Session o Application. Inoltre puoi tenerlo in cache ma non affidabile (possiamo renderlo pragmaticamente affidabile). La maggior parte dei controlli .NET ha in-built ViewState.

+0

come conosco gridview adatto per la visualizzazione e la modifica di righe di dati che rappresentano come DataTable nell'origine dati sottostante, ma ho bisogno di visualizzare un qualche tipo di modulo che deve essere associato all'oggetto buisness e questo è non supportato perché il web è senza stato) – Alexander

0

Per coloro che cercano, ho creato questo plugin per javascript. Il binding dei dati è molto simile a quello che fa WPF ed è facile da usare. Esso ha allegato la documentazione in un file .txt

https://github.com/jdemeuse1204/ObjectDataBinding

Ecco un esempio di ciò che uno dei miei attacchi si presenta come

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

Per attivare chiamate

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

Per ottenere l'oggetto torna per salvare o altre operazioni

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