2012-08-02 1 views
0

Mon contrôle serveur requiert des propriétés à définir par le balisage comme ceci:Comment lancer une exception HttpParseException à partir de mon contrôle serveur personnalisé lorsqu'une propriété requise est manquante?

<cc:MyControl runat="server" Property="Required" /> 

Lorsqu'un développeur oublie d'ajouter la propriété, je jette une exception. Cela se produit dans le getter de la propriété publique:

public string Property 
{ 
    get { return GetRequiredPropertyFromViewState["Property"]; } 
    set { ViewState["Property"] = value; } 
} 

Dans le YSOD je reçois une erreur de source et trace de la pile. La source affichée est celle de ma classe de contrôle personnalisé:

Line 173: throw new ArgumentException(message); 

Je voudrais afficher le balisage du contrôle que l'erreur source. Est-ce possible? Je sais seulement que l'analyseur de page WebForms montrera parfois des erreurs d'analyse avec le balisage dans l'erreur de source. Mais ce ne sont pas vraiment des exceptions.

Modifier: J'avais tort. Des erreurs d'analyse peuvent être levées en utilisant HttpParseException. Mais vous avez spécifié le fichier, le code source et le numéro de ligne. Je ne sais pas si je peux fournir ceux de mon contrôle personnalisé. J'ai besoin ces trois, dont je ne sais pas comment les deux derniers:

  1. virtualPath: Je peux obtenir de Page.Request.AppRelativeCurrentExecutionFilePath
  2. source:
  3. ligne:

Répondre

0

J'ai trouvé que vous ne pouvez pas faire cela à partir du contrôle lui-même, car une fois qu'il est initialisé, il ne peut pas revenir à l'infrastructure de l'analyseur.

Mais vous pouvez associer un control builder class à votre contrôle serveur. Cette classe participe à l'analyse de la page. Si vous lancez un HttpParserException avec juste un message d'erreur de la méthode Init, le code et la ligne du balisage de contrôle sont ajoutés par le framework.

je suis venu avec cette méthode pour valider les propriétés requises basées sur des annotations de données:

private void ValidateAttribute(PropertyInfo attribute, object value) 
{ 
    // Reflect all the data annotations' validator attributes on the control property... 
    object[] validators = attribute.GetCustomAttributes(typeof(ValidationAttribute), false); 

    // ...and validate each one 
    foreach (ValidationAttribute validator in validators) 
    { 
    try 
    { 
     validator.Validate(value, attribute.Name); 
    } 
    catch (ValidationException exception) 
    { 
     // Show as parser error in browser 
     throw new HttpParseException(exception.Message); 
    } 
    } 
} 

Appelez-le de ControlBuilder.Init() et associer le générateur de contrôle avec un contrôle serveur en utilisant le ControlBuilderAttribute.

Questions connexes