2009-07-06 6 views
17

Esto podría ser una pregunta muy tonta, pero estoy aprendiendo .NET, así que estoy bastante desorientado ...mejor manera de acceder a las propiedades de mi código detrás de la clase de marcas en ASP.NET

Digamos que tengo dos archivos default.aspx y el default.aspx.cs asociado.

default.aspx.cs:

protected void Page_Load(object sender, EventArgs e) 
{ 
    var myObject = new MyObject(); 
} 

¿Hay una manera que en el default.aspx que podía hacer algo como:

<%= myObject.SomePropertyOfThisObject%> 

... o algo similar, sin tener que utilizar databinders o algo complicado como este? Y si no hay forma de enlazar los datos, ¿cuál sería la mejor manera de hacerlo?

+0

No entiendo muy bien lo que estás tratando de hacer ... – sebagomez

+0

definiendo un objeto en mi .cs y usándolo en mi .aspx – marcgg

+0

Eso es un poco al revés para las formas web. Olvídate del hábito de poner ese tipo de lógica en tu código apsx. Agregue una etiqueta o control literal en su lugar. –

Respuesta

30

Se puede, pero usted tiene que hacerlo un poco diferente. En sus default.aspx.cs, agregar un miembro:

protected MyObject _myObject; 

Luego, en Load:

protected void Page_Load(object sender, EventArgs e) 
{ 
     _myObject = new MyObject(); 
} 

Luego, en Default.aspx, que puede hacer:

<%= _myObject.SomePropertyOfThisObject %> 

De Por supuesto, esto supone que la clase MyObject tiene una propiedad llamada Awesome. No se refería a la clase System.Object, ¿verdad?, Ya que no tiene una propiedad llamada Awesome.


Desde su pregunta estaba preguntando sobre la mejor manera , voy a ir más lejos. La forma en que mostré no es la mejor. Lo mejor es más a menudo usar una expresión de enlace de datos. Si no te gusta los que, a continuación, puede poner las cosas en el código subyacente:

protected void Page_Load(object sender, EventArgs e) 
{ 
     _myObject = new MyObject(); 
     // 
     _myLabel.Text = _myObject.SomePropertyOfThisObject; 
} 

Suponiendo:

<asp:Label runat="server" id="_myLabel" /> 
0

¿No tiene que ser público para ser accesible en ese ámbito?

..

public var myObject = null; 
protected void Page_Load(object sender, EventArgs e) 
{ 
    myObject = new Object(); 
} 
+2

protected es suficiente (los mismos requisitos que tiene Page_Load) –

5

El <% = ...%> es ASPX corto la mano para Response.Write(....).

Si cambia myObject estar fuertemente tipos (y no sólo como tipos de objetos) se puede cierto uso de la línea:

<%= myObject.Awesome %> 

para emitir un valor.

Tenga en cuenta, sin embargo, que la <% = sintaxis tiene limitaciones - específicamente:

  • que no se puede utilizar dentro de atributo HTML como un valor
  • no puede emitir elementos del lado del servidor
  • se no se puede utilizar en ASP UpdatePanels: obtendrá una excepción al realizar una devolución de datos parcial

Probablemente sea mejor que cree un control de etiqueta en su p de edad y establecer programáticamente la propiedad Text en el valor. Esto también le brinda más control sobre cómo se realizan las conversiones de valor a cadena. Y funcionará correctamente con los controles del panel de actualización.

1

Puede hacer cualquier codificación que le gustaría hacer directamente en el archivo ASPX, en lugar de usar codebehind. Por lo tanto, para lograr lo que creo que desea hacer, tendría ...

<some html> 

<% var MyObject = new MyObject(); 
    Response.Write(myObj.Awesome()); %> 

<some html> 

Sin embargo, esto realmente no es recomendable. Codebehind es la forma sugerida de "mejores prácticas" de hacer las cosas, porque esto separa tu código de tu marcado, que es fundamental en cualquier buena arquitectura. Recomendaría usar algo como lo que publicó John Saunders para evitar el enlace de datos, pero realmente debería considerar manipular sus controles en el código subyacente utilizando los eventos del ciclo de vida en lugar de generar propiedades de objetos directamente en su HTML. Por ejemplo, si estuviera tratando de salida de un texto, a continuación, hacer algo como

var literal = new LiteralControl(myObject.Awesome()); 
myPanel.Controls.Add(literal); 
1

Se puede declarar variables como protegidas en el código subyacente (Cs) y luego llamar a la de la página aspx para recuperar todos los datos.

p. Ej.

protected IEnumerable<Class> _mydata; 

internal void MyDefaultData() 
{ 
mydata = doallthework; 
} 

en la página aspx usted puede hacer como siguiendo

<%=_mydata.FirstOrDefault().FirstName%>

Asegúrese método se llama la carga.

Cuestiones relacionadas