服务器标记不能包含<%...%>结构

Him*_*ack 23 c# asp.net

我正在尝试将CDN用于我网站上的图像.问题是,有时我有服务器控件,如ImageButton,我想使用一个类,以完全提取CDN的路径.为此,我试着做:

<asp:ImageButton runat="server" OnClick="Agree" ImageUrl="<%=ResourceManager.GetImageCDN("iagree.png")%>" />
Run Code Online (Sandbox Code Playgroud)

我得到的标题是错误的.

只有当我使用<%#时它才会起作用(并且只有在我进行数据绑定时).我怎么能这么容易做到?如何在我的标记代码上放置CDN代码?

谢谢!

Nic*_*ick 24

如果将来其他人遇到此线程,您可以通过使用单引号而不是双引号来包围服务器标记来获得所需的结果.

原本的:

<asp:ImageButton runat="server" OnClick="Agree" ImageUrl="<%=ResourceManager.GetImageCDN("iagree.png")%>" />
Run Code Online (Sandbox Code Playgroud)

新版本:

<asp:ImageButton runat="server" OnClick="Agree" ImageUrl='<%=ResourceManager.GetImageCDN("iagree.png")%>' />
Run Code Online (Sandbox Code Playgroud)

这适用于.Net 4.0,但我认为它也适用于其他版本.

  • 这只是为我输出包含<%=的实际标签 (31认同)

Ric*_*kNZ 23

有四个选项(除了" <%# %>"样式数据绑定,我不推荐):

  1. 在后面的代码中设置值.这会使ViewState膨胀,当然还需要为控件的每个实例更改代码.
  2. 使用自定义ExpressionBuilder.这不会使ViewState膨胀,但它确实需要更改所有标记.
  3. 使用控制适配器在应用程序的任何位置更改控件的行为; 例如,通过在呈现控件之前修改ImageUrl属性.可以在没有ViewState影响的情况下完成.
  4. 使用继承自ImageButton类的类,结合标记映射,在应用程序的任何位置使用该类而不是原始类,并且无需更改标记.可以在没有ViewState影响的情况下完成.

最佳选择取决于您的应用程序的要求,但如果您想在站点范围内进行更改,我通常更喜欢控制适配器.

这是一个例子,如果它有帮助:

using System;
using System.IO;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.Adapters;

namespace Sample
{
    public class ImageButtonControlAdapter : WebControlAdapter
    {
        protected override void BeginRender(HtmlTextWriter writer)
        {
            ImageButton image = this.Control as ImageButton;
            if ((image != null) && !String.IsNullOrEmpty(image.ImageUrl))
            {
                //
                // Decide here which objects you want to change
                //
                if (!image.ImageUrl.StartsWith("http") && 
                    !image.ImageUrl.StartsWith("data:"))
                {
                    image.ImageUrl = ResourceManager.GetImageCDN(image.ImageUrl);
                }
            }
            base.BeginRender(writer);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用App_Browers/adapter.browser中的以下条目将其配置到您的应用程序中:

<browsers>
  <browser refID="Default">
    <controlAdapters>
      <adapter controlType="System.Web.UI.WebControls.ImageButton"
               adapterType="Sample.ImageButtonControlAdapter" />
    </controlAdapters>
  </browser>
</browsers>
Run Code Online (Sandbox Code Playgroud)

你的标记是:

<asp:ImageButton runat="server" OnClick="Agree" ImageUrl="iagree.png" />
Run Code Online (Sandbox Code Playgroud)

很酷,对吧?


Tim*_*ora 12

您可以通过创建自己的代码表达式生成器来评估服务器标记中的代码.这很简单.

[ExpressionPrefix( "Code" )]
public class CodeExpressionBuilder : ExpressionBuilder
{
    public override CodeExpression GetCodeExpression( BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context )
    {
        return new CodeSnippetExpression( entry.Expression );
    }
}
Run Code Online (Sandbox Code Playgroud)

并在web.config中输入一个条目:

<compilation debug="true" targetFramework="4.0">
    <expressionBuilders>
        <add expressionPrefix="Code" type="[YourNamespace].CodeExpressionBuilder"/>
    </expressionBuilders>
</compilation>
Run Code Online (Sandbox Code Playgroud)

这允许您使用如下语法:

<asp:ImageButton runat="server" ImageUrl='<%$ Code:ResourceManager.GetImageCDN("iagree.png") %>'>
Run Code Online (Sandbox Code Playgroud)

以下是完整的解释:http://weblogs.asp.net/infinitiesloop/archive/2006/08/09/The-CodeExpressionBuilder.aspx