Maison >développement back-end >Tutoriel C#.Net >Solution à l'erreur lors du rendu des contrôles dans VS2010

Solution à l'erreur lors du rendu des contrôles dans VS2010

高洛峰
高洛峰original
2017-01-11 10:44:011704parcourir

Lors de la création de contrôles, il est facile de rencontrer des erreurs telles que « Une erreur s'est produite lors du rendu du contrôle » et « Une exception non gérée s'est produite. La référence de l'objet n'a pas été définie sur une instance de l'objet. », comme indiqué ci-dessous : (Cela peut aussi être simplement dû au fait que l'objet n'est pas défini sur une instance de l'objet.) La définition de la balise runat="server" provoque cette erreur, veuillez d'abord vérifier cet élément)
Mais il n'y a pas d'erreur au moment de la compilation/ exécution.

Analyse
La situation représentée dans la figure est appelée "temps de conception" pour la distinguer du "temps de compilation"/"temps d'exécution".

Temps de conception : dans l'environnement ASP.NET, c'est à ce moment-là que nous utilisons le concepteur Web pour éditer dans Visual Studio. La compréhension directe est lorsque la page ASPX passe à « Conception ».

Temps de compilation : la compréhension directe est que lorsque vous compilez, les erreurs à ce moment-là sont généralement des erreurs causées par la vérification de type, la correspondance de paramètres, etc. qui peuvent être directement limitées par des contraintes de syntaxe.

Exécution : la compréhension directe se fait lorsque vous prévisualisez/exécutez. Habituellement, les erreurs à ce stade sont composées d’exceptions spécifiques et d’erreurs logiques.
Analysons les performances du contrôle lors de la conception. Lorsque notre contrôle est conçu, VS simule intelligemment l'apparence du contrôle de sortie au moment de l'exécution. La présentation du contrôle passe une certaine séquence de méthodes et forme finalement la sortie actuelle. . Selon la norme, nous devrions effectuer l'opération de sortie sur le contrôle dans Render ou RenderContents (en fait, d'autres sont également possibles, mais nous ne le faisons généralement pas, ou davantage d'exceptions "erreur lors du rendu du contrôle" proviennent principalement de Render ou RenderContents ).
D'après le message d'erreur "La référence de l'objet n'est pas définie sur une instance de l'objet." À en juger par cette phrase, c'est-à-dire qu'une ou plusieurs instances de l'objet sont utilisées sans attribuer de valeur initiale.

Jetons un coup d'œil à notre code :

protected override void RenderContents(HtmlTextWriter writer)
{
 UpButton.Text = Page.Server.HtmlDecode(UpButton.Text);
 DownButton.Text = Page.Server.HtmlDecode(DownButton.Text);
 base.RenderContents(writer);
}

Parce que le contrôle doit avoir un bouton haut et un bouton bas lors de la conception, deux boutons sont respectivement nécessaires. sont des signes de ponctuation spéciaux de haut en bas, et ces deux symboles doivent être correctement restitués par le navigateur en définissant les numéros de code comme indiqué ci-dessous :

private string upButtonText = "∧";
private string downButtonText = "∨";

Et ces deux symboles sont avant le rendu Cependant, ce sera compilé par une méthode HtmlEncode sur la page puis affiché. Cependant, ces deux signes spéciaux ne peuvent être présentés que via une sortie directe, c'est-à-dire qu'après HtmlEncode, les signes spéciaux ne peuvent être affichés que sous forme de texte ∧ ∨ Le haut. et les flèches vers le bas ne sont pas affichées. À ce stade, nous devons introduire sa méthode inverse Page.Server.HtmlDecode pour le décodage. Notez que nous utilisons ici l'instance Page. Cette instance n'est non nulle que lorsque la page existe réellement. et une telle opération affichera "Référence d'objet non définie sur une instance de l'erreur d'objet".
Temps de conception : comme nous venons de le mentionner, le temps de conception simule uniquement le processus de rendu de la page, et la page n'existe pas réellement. Par conséquent, l’instance de l’objet Page sera vide à ce moment-là et les appels suivants lèveront une exception.

En supposant que nous disposons uniquement de cette méthode pour gérer le comportement actuellement requis, alors lorsque nous appellerons Page, cela entraînera certainement un objet nul et provoquera des exceptions dans les opérations ultérieures. Nous introduisons actuellement le concept de « mode conception » (pas DesignPattern mais DesignMode). DesignMode est une propriété protégée de la classe Control, qui obtient une valeur pour indiquer si le composant est actuellement en mode conception. Le modèle de conception ici équivaut au concept de design.

Nous pouvons donc transformer le code sous la forme suivante :

protected override void RenderContents(HtmlTextWriter writer)
{
 if (!DesignMode)
 {
 UpButton.Text = Page.Server.HtmlDecode(UpButton.Text);
 DownButton.Text = Page.Server.HtmlDecode(DownButton.Text);
 }
 base.RenderContents(writer);
}

De cette façon, nous introduisons uniquement des instances de l'objet Page lorsque ce n'est pas le moment de la conception, donc la conception exceptions de temps Cela sera résolu facilement.

Résumé

Par conséquent, lors de la conception d'un contrôle, en particulier lorsque l'on considère la présentation du contrôle, afin d'éviter l'apparition d'exceptions similaires, nous devons considérer que le contrôle peut obtenir suffisamment de ressources, pour les éléments qui ne parviennent pas à obtenir des ressources, nous devons les distinguer explicitement (comme dans le code ci-dessus, DesignMode est utilisé pour déterminer s'il s'agit de code à exécuter au moment de la conception).

Extension

La situation que nous venons de voir peut être attribuée à l'exception causée par l'incapacité de référencer des instances spécifiques lors de la conception. Des exceptions similaires se produiront également dans les bases de données/La. Le système de fichiers est lu, la variable n'a pas de valeur initiale attachée et les propriétés de type page telles que Session, Page.Request.QueryString, etc. sont appelées. Lors de la conception de la page, étant donné que certaines des solutions ci-dessus, en particulier les méthodes associées appelées à la page, existeront toujours, nous ne verrons pas souvent d'exceptions. Nous devrions y prêter plus d'attention lors de la conception des contrôles.

Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'apprentissage de chacun. J'espère également que tout le monde soutiendra le site Web PHP chinois.

Pour plus d'articles sur les solutions aux erreurs lors du rendu des contrôles dans VS2010, veuillez faire attention au site Web PHP chinois !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn