2010-12-08 4 views
3

Ok, donc il apparaît dans la .NET framework API docs que la propriété CommandArgument de la classe CommandEventArg est de type « objet » suggérant que je pourrais lui confier autre chose qu'un objet chaîne mais je reçois un InvalidCastException utilisant le code ci-dessous:Comment utiliser un objet Command Command .NET en tant qu'objet non-chaîne?

[code ASPX]

... 
<asp:Button ID="Button1" runat="server" CommandArgument='<%# context %>' oncommand='reviewContext' </asp:Button> 
... 

[aspx.cs code behind]

... 
public Enum Context { C1, C2, C3 } 

public Context context { get { return Context.C1; } } 
... 
public void reviewContext (object sender, CommandEventArg e) {  
    if((Context) e.CommandArgument == Context.C1) { /*Do something in context of C1 */} 
} 

Pourquoi est-il Tabu d'attribuer autre chose qu'une chaîne à la bonne CommandEventArg ty?

Répondre

2

Parce qu'il doit rendre l'élément dans le code HTML, s'il ne peut pas en faire une chaîne comment il peut rendre.

return Context.C1.ToString() 

Cela fonctionnera correctement.

+1

Merci Hogan, ça a du sens je pense ... que dire que le HTML servi doit inclure une sorte de texte à poster dans le cadre de la réponse du bouton? Donc je suppose que ma question est vraiment, "pourquoi l'API CommandEventArg dit-elle que ça peut être un objet?" – Travis

+0

Parce que tous les objets doivent implémenter ToString() – Hogan

+1

Oui, mais aussi toutes les chaînes :) alors pourquoi ne pas simplement définir CommandArgument comme un objet chaîne au lieu d'un objet générique si tous les gestionnaires d'événements doivent le traiter comme une chaîne ...? – Travis

1

Vous pouvez utiliser votre énumération, vous ne pouvez pas le faire du côté HTML. Le côté HTML est spécifiquement une représentation sous forme de chaîne des classes impliquées. Vous pouvez cependant assigner une fonction à cet événement de liaison de données, et retourner la représentation de chaîne de ce qui est nécessaire, si

public Context context { get { return Context.C1; } } 

devient

public string context { get { return Context.C1.ToString(); } } 

Toutefois, afin d'utiliser les énumérations une fois que vous re en reviewContext vous devrez analyser le ENUM dans le but de faire la comparaison:

(Context)Enum.Parse(typeof(Context), "C1"); 

note: vous pouvez toujours utiliser les cordes pour faire la comparaison, mais cela défait le point de l'enum je pense.

+0

Merci Joël, c'est essentiellement ce que j'ai fini par faire ... Je suppose que je pensais que le moteur ASP.NET allait convertir mon énumération en une chaîne et revenir sur le serveur mais comme vous l'avez démontré, le faire moi-même n'est pas grosse affaire. – Travis

Questions connexes