内联脚本无法在ASP.Net自定义控件中解析

时间:2008-10-22 11:23:33

标签: asp.net validation controls

目前我正在使用自定义正则表达式验证器(不幸的是)

我正在尝试使用服务器端内联脚本设置正则表达式模式,如下所示:

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

但是,脚本无法解析为服务器端代码。相反,它是按字面解释的,我最终在渲染的标记中得到类似的东西:

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

有关为何没有正确解决的任何线索?

8 个答案:

答案 0 :(得分:2)

但为什么会这样呢?我可以使用简单的aspx页面重现您的问题,如下所示:

<%@ 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>

提交表单后显示以下内容:

  

查询字符串值:   %3C%25 =的Request.QueryString%25%3E

由于某种原因,内联代码在执行时不会执行 runat =“server”存在。奇怪的是我有3台机器 这样做并没有这样做,所以我只能假设 这是一个IIS / .NET配置问题,可能是由最近的MS引起的 更新。我最近在机器上安装的软件 表现出这种行为是: Visual Studio 2008 WSE 3.0 IE8 RC1

我想知道这些是否导致了这一点?

答案 1 :(得分:2)

这已经被我的MS清理了。我发现的问题是由于服务器表单中的“action”属性在.NET 2 SP2之前没有任何影响,但现在可以设置。代码渲染块从未在属性值中起作用 - 这将在本文结尾处解释。

这是Microsoft .NET Framework 3.5 SP1中引入的行为故意更改的结果。在Service Pack之前,服务器端FORM标记上的action和method属性无法覆盖。如果指定,它们将被“POST”和“页面名称”替换为ASP.NET。

以前,ASP.NET页面解析器并没有阻止指定这些属性,尽管文档建议不要使用action属性: http://msdn.microsoft.com/en-us/library/k33801s3.aspx

特别是评论(在FORM元素的上下文中):

•“开始标记不得包含操作属性.ASP.NET在处理页面时动态设置这些属性,覆盖您可能进行的任何设置。”

最初由Josh报告的问题,其中代码块未被解释不是新行为,而是已知错误 - 代码呈现块不能在服务器控件属性中使用。这被报告为“连接”错误: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=109257 其中包含以下内容: “服务器控件的属性不能将内联表达式作为值。这解释了出现的意外行为:”&lt; link href =“&lt;%= RootPath%&gt; ...”但是,内联代码可用于值属性。“

答案 2 :(得分:1)

devstuff,这并不能解释为什么这对我的3台机器起作用,而不是第4台,是吗?他们都使用相同的.NET Framework版本和IIS设置(我相信,已经检查了多少我coukd)

答案 3 :(得分:1)

我在调查这个时已经卸载了.NET框架(3.5然后是3.0和2.0) - 之后我没有遇到任何问题 安装以下各项: .net framework 2.0 .net framework 2.0 SP1 .net framework 3.0 .net framework 3.0 SP1 .net framework 3.5

但是在我安装了.net framework 3.5 SP1后,行为又回来了 - 我想这就是问题所在。我已经向微软提出这个问题,并在收到回复时更新这个帖子。

答案 4 :(得分:0)

Web控件中的值不呈现服务器端代码。 而是从Code Behind

中设置
RegExValidator1.ValidationExpression = RegExStrings.SomePattern;

答案 5 :(得分:0)

它被视为文字字符串,请尝试

ValidationExpression ='&lt;%= RegExStrings.SomePattern%&gt;'

编辑:以上不起作用,我试图看看如何做到这一点没有成功,我通常在代码隐藏中设置属性,只在必要时才使用这种语法进行数据绑定。我有兴趣知道是否可以这样做。

答案 6 :(得分:0)

如果正则表达式验证程序具有runat =“server”属性,则从后面的代码中更改它。这会容易得多。

答案 7 :(得分:0)

您在不是数据绑定的控件上使用数据绑定表达式。您需要调用DataBind(),或使用ExpressionBuilder实现。可以在http://weblogs.asp.net/infinitiesloop/archive/2006/08/09/The-CodeExpressionBuilder.aspx

找到用于绑定到仲裁代码的简单ExpressionBuilder