2011-09-15 16 views
5

Let decir que tenemos un objetodos vías de enlace de datos en ASP.NET

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

Quiero unir propiedades a dos cuadros de texto en una página o menos así:

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

y luego escribir este en código detrás de

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

Y cuando ingreso valores en cuadros de texto, espero que EntityObject tenga estos valores en propiedades wh La página se recarga después de PostBack, pero las propiedades siempre son nulas. Por favor ayuda, ¿dónde voy mal?

Respuesta

4

triste decirlo, pero aps.net no soporta bidireccional unión a objetos .NET ... su lugar se puede usar algo como "manual vinculante" en todos los envíos hacia atrás (en este caso es 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

En el OnInit que siempre están haciendo en nulo .. eliminar aquellas código y mantenerlo en la carga de la página ..

sólo tiene que unirse en el primer tiempo no en todo el segundo palo.

Load() {

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

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

}

+0

que parece ser valores útiles, ahora introducidos mantiene después de la devolución de datos, pero cuando tengo acceso EntityObject que stiil tener todos los nulos – Alexander

+0

vistazo a mis comentarios anteriores y intente con eso ... espero que eso ayude ... –

0

aquí el problema es que están tratando de crear dynami c control.

se puede utilizar un control GridView en la página .aspx y enlazar los datos, que tiene estado de vista por defecto en lugar de los suyos ..

De todos modos web es sin estado, debemos conservar los datos a través de ViewState o sesión o aplicación. También puede mantenerlo en caché pero no es confiable (podemos hacerlo confiable de manera pragmática). La mayoría de los controles .NET tienen incorporado ViewState.

+0

como sé que gridview es adecuado para mostrar y editar filas de datos que representan como DataTable en el origen de datos subyacente, pero necesito mostrar algún tipo de formulario que deba vincularse al objeto buisness y esto es no soportado sea porque la web no tiene estado) – Alexander

0

Para aquellos que buscan, hice este plugin de Javascript. Hace el enlace de datos muy cerca de lo que hace WPF y es fácil de usar. Se ha fijado la documentación en un archivo .txt

https://github.com/jdemeuse1204/ObjectDataBinding

He aquí un ejemplo de lo que una de mis fijaciones parece

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

Para activar usted llama

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

Para llegar el objeto de regreso para guardar u otras operaciones

var object = $("#yourelementname").getObserveObject('yourbindingname'); 
Cuestiones relacionadas