代码之家  ›  专栏  ›  技术社区  ›  Josh

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

  •  2
  • Josh  · 技术社区  · 16 年前

    目前我正在与 习俗 正则表达式验证器 (不幸的是) .

    我尝试使用如下服务器端内联脚本设置regex模式:

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

    但是,脚本没有解析为服务器端代码。相反,它是逐字解释的,我最终在呈现的标记中得到类似这样的结果:

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

    有什么线索可以解释为什么这个问题不能正确解决吗?

    8 回复  |  直到 16 年前
        1
  •  2
  •   MarkD    16 年前

    现在我的MS已经清除了这一点。我发现的问题是由于服务器表单中的“action”属性在.NET 2 SP2之前没有任何效果,但现在可以设置。代码呈现块从来没有在属性值中工作过——这在本文的结尾部分已经解释过了。

    这是Microsoft.NET Framework 3.5 SP1中引入的行为故意改变的结果。在Service Pack之前,服务器端表单标记上的操作和方法属性不能覆盖。如果指定,它们将被ASP.NET替换为“post”和“page name”。

    以前,ASP.NET页面分析程序没有阻止指定这些属性的操作,尽管文档建议不要指定这些属性: http://msdn.microsoft.com/en-us/library/k33801s3.aspx

    尤其是注释(在表单元素的上下文中):

    _ASP.NET在处理页面时动态设置这些属性,覆盖您可能进行的任何设置。”

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

        2
  •  2
  •   MarkD    16 年前

    但这是为什么?我可以使用以下简单的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=请求。查询字符串%25%3e

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

    我想知道这些是否造成了这种情况?

        3
  •  1
  •   MarkD    16 年前

    Devstufacture,这不能解释为什么它在我的3台机器上有效,但不是第4台,是吗?他们都在使用相同的.NET框架版本和IIS设置(我相信,我已经检查了尽可能多的版本)

        4
  •  1
  •   MarkD    16 年前

    我在调查时卸载了.NET框架(3.5、3.0和2.0),之后我没有遇到任何问题。 安装以下各项: .NET框架2.0 .NET框架2.0 SP1 .NET框架3.0 .NET框架3.5

    但在我安装了.NET Framework 3.5 SP1之后,行为返回了“我想这就是问题所在”。我已向Microsoft提出此问题,并将在收到响应时更新此线程。

        5
  •  0
  •   WebDude    16 年前

    Web控件中的值不呈现服务器端代码。 而是从后面的代码中设置它

    RegExValidator1.ValidationExpression = RegExStrings.SomePattern;
    
        6
  •  0
  •   PhilGriffin    16 年前

    它被当作一个文字字符串,试试看

    validationExpression='<%=regexStrings.somePattern%>'

    编辑:上面的操作不起作用,我试着看看如何在没有成功的情况下做到这一点,我通常在代码隐藏中设置属性,并且在需要的时候只使用这个语法进行数据绑定。我想知道是否也能做到。

        7
  •  0
  •   Razor    16 年前

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

        8
  •  0
  •   devstuff    16 年前

    您正在对未绑定数据的控件使用数据绑定表达式。您需要调用databind(),或者使用ExpressionBuilder实现。用于绑定任意代码的简单表达式生成器可以在 http://weblogs.asp.net/infinitiesloop/archive/2006/08/09/The-CodeExpressionBuilder.aspx