2009-07-06 10 views
17

Cela pourrait être une question vraiment stupide mais j'apprends .NET, donc je suis assez désemparés ...La meilleure façon d'accéder aux propriétés de mon code derrière la classe du balisage dans ASP.NET

Disons que j'ai deux fichiers default.aspx et le fichier default.aspx.cs associé.

default.aspx.cs:

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

Est-il possible que dans le default.aspx que je pouvais faire quelque chose comme:

<%= myObject.SomePropertyOfThisObject%> 

... ou quelque chose de similaire, sans avoir à utiliser des DataBinders ou quelque chose de compliqué comme ça? Et s'il n'y a pas moyen de lier les données, quelle serait la meilleure façon de le faire?

+0

Je ne comprends pas très bien ce que vous essayez de faire ... – sebagomez

+0

définir un objet dans mon .cs et l'utiliser dans mon .aspx – marcgg

+0

C'est un peu en arrière pour les webforms. Sortez de l'habitude de mettre ce genre de logique dans votre code apsx. Ajoutez un contrôle label ou littéral à la place. –

Répondre

30

Vous pouvez, mais vous devrez faire un peu différemment. Dans votre default.aspx.cs, ajouter un membre:

protected MyObject _myObject; 

Puis, en Page_Load:

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

Puis, en default.aspx, vous pouvez faire:

<%= _myObject.SomePropertyOfThisObject %> 

de Bien sûr, cela suppose que la classe MyObject a une propriété nommée Awesome. Vous ne parliez pas de la classe System.Object, n'est-ce pas, puisqu'elle n'a pas de propriété nommée Awesome.


Étant donné que votre question demandait au sujet de la meilleure façon, je vais aller plus loin. La façon dont j'ai montré n'est pas la meilleure. Le mieux est le plus souvent d'utiliser une expression de liaison de données. Si vous ne l'aimez pas ceux-ci, vous pouvez définir les choses dans le behind:

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

En supposant:

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

N'est-il pas nécessaire que ce soit public pour être accessible dans ce cadre?

..

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

protégé est suffisant (mêmes exigences que Page_Load a) –

5

Le <% = ...%> est sténographie ASPX pour Response.Write(....).

Si vous changez myObject être fortement types (plutôt que des types comme objet), vous pouvez utiliser la ligne certaine:

<%= myObject.Awesome %> 

pour émettre une valeur.

Sachez, cependant, que la <% = syntaxe a des limites - en particulier:

  • il ne peut pas être utilisé dans l'attribut HTML comme une valeur
  • il ne peut pas émettre des éléments côté serveur
  • il ne peut pas être utilisé dans ASP UpdatePanels - vous obtiendrez une exception lorsque vous effectuez une publication partielle

Vous êtes probablement mieux de créer un contrôle Label sur vous p age et en définissant par programme la propriété Text à la valeur. Cela vous donne également plus de contrôle sur la façon dont les conversions de valeur en chaîne sont effectuées. Et fonctionnera correctement avec les contrôles du panneau de mise à jour.

1

Vous pouvez effectuer le codage que vous souhaitez effectuer directement dans le fichier ASPX, plutôt que d'utiliser codebehind. Donc, pour accomplir ce que je pense que vous voulez faire, vous auriez ...

<some html> 

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

<some html> 

Cependant, ce n'est vraiment pas recommandé. Codebehind est la meilleure façon de faire les choses, parce que cela sépare votre code de votre balisage, ce qui est fondamental dans toute bonne architecture. Je recommande d'utiliser quelque chose comme ce que John Saunders a posté afin d'éviter la liaison de données, mais vous devriez vraiment envisager de manipuler vos contrôles dans le codebehind en utilisant les événements de cycle de vie plutôt que de sortir directement les propriétés de votre HTML. Par exemple, si vous essayiez de sortie du texte, faire quelque chose comme

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

Vous pouvez déclarer variable protégée dans le code derrière (.cs) puis appeler à la page ASPX pour récupérer toutes les données.

par exemple.

protected IEnumerable<Class> _mydata; 

internal void MyDefaultData() 
{ 
mydata = doallthework; 
} 

à la page ASPX vous pouvez faire comme suit

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

Assurez-vous que la méthode est appelée la charge.

Questions connexes