服务器标记不能包含结构

我想在网站上使用CDN作为我的图像。 问题是,有时我有像ImageButton这样的服务器控件,我想使用一个类来完全提取CDN的路径。 为此,我试着做:

<asp:ImageButton runat="server" OnClick="Agree" ImageUrl="" /> 

我得到的标题是错误的。

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

谢谢!

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

  1. 在后面的代码中设置值。 这会使ViewState膨胀,当然还需要为控件的每个实例更改代码。
  2. 使用自定义ExpressionBuilder。 这不会使ViewState膨胀,但它确实需要更改所有标记。
  3. 使用控制适配器在应用程序的任何位置更改控件的行为; 例如,通过在呈现控件之前修改ImageUrl属性。 可以在没有ViewState影响的情况下完成。
  4. 使用inheritance自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); } } } 

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

        

你的标记是:

  

很酷,对吧?

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

原本的:

 " /> 

新版本:

  

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

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

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

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

      

这允许您使用如下语法:

  

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

当然,最好的办法是给imagebutton一个id,例如:

  

然后在您的页面加载中分配imageurl:

 void Page_Load(...) { if (!Page.IsPostback) { IAgreeImageButton.ImageUrl = ResourceManager.GetImageCDN("iagree.png"); } }