2 votes

Inline script ne se résout pas dans un contrôle personnalisé ASP.Net

Actuellement, je travaille avec un personnalisé validateur d'expressions régulières (malheureusement) .

J'essaie de définir le modèle Regex en utilisant un script en ligne côté serveur comme ceci :

ValidationExpression="<%= RegExStrings.SomePattern %>"

Cependant, le script ne se résout pas au code côté serveur. Au lieu de cela, il est interprété littéralement et je me retrouve avec quelque chose comme ceci dans le balisage rendu :

ctl00_DefaultContent_regexValidatorInvitation.validationexpression = "<%= RegExStrings.SomePattern %>";

Avez-vous une idée de la raison pour laquelle ce problème ne se résout pas correctement ?

2voto

MarkD Points 99

Mais pourquoi ça ? Je peux reproduire votre problème en utilisant une simple page aspx comme ci-dessous :

<%@ Page language="c#" AutoEventWireup="true" %>
<html>
  <body >
    <form id="Form1" method="post" runat="server" action="?<%=Request.QueryString%>">
                Query String value: <%=Request.QueryString %>
                <br />
                <input type=submit />
     </form>
  </body>
</html>

Cela affiche ce qui suit après avoir soumis le formulaire :

Valeur de la chaîne de requête : %3c%25=Request.QueryString%25%3e

Pour une raison inconnue, le code en ligne n'est pas exécuté lorsque la commande runat="server" est présent. Ce qui est étrange, c'est que j'ai 3 machines qui ne se comportent pas de cette façon et une qui le fait. Je ne peux donc que supposer qu'il s'agit d'un problème de configuration IIS/.NET, peut-être causé par une récente mise à jour MS. mise à jour récente. Le logiciel que j'ai installé récemment sur la machine qui présente ce comportement sont les suivants Visual Studio 2008 WSE 3.0 IE8 RC1

Je me demande si l'un d'entre eux a causé cela ?

2voto

MarkD Points 99

Ce point a maintenant été éclairci par mon MS. Le problème que j'ai découvert était dû au fait que l'attribut "action" dans les formulaires du serveur n'avait aucun effet avant .NET 2 SP2, mais qu'il peut maintenant être défini. Les blocs de rendu de code n'ont jamais fonctionné dans les valeurs d'attribut - ceci est expliqué vers la fin de cet article.

Il s'agit d'une conséquence d'un changement délibéré de comportement introduit dans Microsoft .NET Framework 3.5 SP1. Avant ce Service Pack, les attributs action et method des balises FORM côté serveur ne pouvaient pas être remplacés. S'ils étaient spécifiés, ils étaient remplacés par ASP.NET par "POST" et "page name".

Auparavant, l'analyseur de pages ASP.NET n'empêchait pas de spécifier ces attributs, bien que la documentation le déconseille pour l'attribut action : http://msdn.microsoft.com/en-us/library/k33801s3.aspx

En particulier le commentaire (dans le contexte de l'élément FORM) :

- " La balise d'ouverture ne doit pas contenir d'attribut d'action. ASP.NET définit ces attributs de manière dynamique lors du traitement de la page, remplaçant ainsi tout paramètre que vous pourriez définir. "

Le problème signalé à l'origine par Josh, où le bloc de code n'était pas interprété, n'est pas un nouveau comportement mais un bogue connu - les blocs de rendu de code ne peuvent pas être utilisés dans les attributs de contrôle du serveur. Ce problème est signalé comme un bogue "Connect" : http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=109257 qui contient les éléments suivants : " Les attributs des contrôles de serveur ne peuvent pas prendre une expression en ligne comme valeur. Ceci explique le comportement inattendu tel que vu avec : " <link href="<%=RootPath %> ..." Cependant, le code inline peut être utilisé pour les valeurs des attributs. "

1voto

MarkD Points 99

Devstuff, cela n'explique pas pourquoi cela fonctionne sur 3 de mes machines, mais pas sur la 4ème, n'est-ce pas ? Elles utilisent toutes la même version de .NET Framework et les mêmes paramètres IIS (je crois, après avoir vérifié autant que possible).

1voto

MarkD Points 99

J'ai désinstallé le cadre .NET pendant que j'étudiais la question (3.5, puis 3.0 et 2.0). l'installation de chacun des éléments suivants : .net framework 2.0 .net framework 2.0 SP1 .net framework 3.0 .net framework 3.0 SP1 .net framework 3.5

Mais après avoir installé .net framework 3.5 SP1, le comportement est revenu - je suppose que c'est là le problème. J'ai soulevé cette question auprès de Microsoft et je mettrai à jour ce fil de discussion lorsque j'obtiendrai une réponse.

0voto

WebDude Points 3326

Les valeurs d'un contrôle web ne rendent pas le code côté serveur. Il faut plutôt le définir à partir du Code Behind

RegExValidator1.ValidationExpression = RegExStrings.SomePattern;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X