C# 服务器标记不能包含<;%…%&燃气轮机;构造
我正在尝试使用CDN为我的网站上的图像。 问题是,有时我有一些服务器控件,比如ImageButton,我想使用一个类来完全提取CDN的路径。为此,我试着做:C# 服务器标记不能包含<;%…%&燃气轮机;构造,c#,asp.net,C#,Asp.net,我正在尝试使用CDN为我的网站上的图像。 问题是,有时我有一些服务器控件,比如ImageButton,我想使用一个类来完全提取CDN的路径。为此,我试着做: <asp:ImageButton runat="server" OnClick="Agree" ImageUrl="<%=ResourceManager.GetImageCDN("iagree.png")%>" /> 我得到的标题是错误的 当然,只有当我使用时,你最好的选择是给imagebutton一个id,例
<asp:ImageButton runat="server" OnClick="Agree" ImageUrl="<%=ResourceManager.GetImageCDN("iagree.png")%>" />
我得到的标题是错误的
当然,只有当我使用时,你最好的选择是给imagebutton一个id,例如:
<asp:ImageButton id="IAgreeImageButton" runat="server" Onclick="Agree" />
您可以通过创建自己的代码表达式生成器来计算服务器标记中的代码。这很简单
[ExpressionPrefix( "Code" )]
public class CodeExpressionBuilder : ExpressionBuilder
{
public override CodeExpression GetCodeExpression( BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context )
{
return new CodeSnippetExpression( entry.Expression );
}
}
和web.config中的一个条目:
<compilation debug="true" targetFramework="4.0">
<expressionBuilders>
<add expressionPrefix="Code" type="[YourNamespace].CodeExpressionBuilder"/>
</expressionBuilders>
</compilation>
有四个选项(除了“
”样式的数据绑定之外,我不推荐使用):
在代码隐藏中设置值。这会使ViewState膨胀,当然需要对控件的每个实例进行代码更改
使用自定义ExpressionBuilder。这不会膨胀ViewState,但需要更改所有标记
使用控件适配器更改应用程序中任何地方控件的行为;例如,在呈现控件之前修改ImageUrl属性。可以在不影响ViewState的情况下完成
使用从ImageButton类继承的类,并结合标记映射来使用该类,而不是应用程序中的原始everywhere,并且无需更改标记。可以在不影响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中的以下条目将其配置到应用程序中:
<browsers>
<browser refID="Default">
<controlAdapters>
<adapter controlType="System.Web.UI.WebControls.ImageButton"
adapterType="Sample.ImageButtonControlAdapter" />
</controlAdapters>
</browser>
</browsers>
您的标记将是:
<asp:ImageButton runat="server" OnClick="Agree" ImageUrl="iagree.png" />
很酷,对吧???如果将来有人遇到此线程,您可以通过使用单引号而不是双引号包围服务器标记来获得所需的结果
原件:
<asp:ImageButton runat="server" OnClick="Agree" ImageUrl="<%=ResourceManager.GetImageCDN("iagree.png")%>" />
新版本:
<asp:ImageButton runat="server" OnClick="Agree" ImageUrl='<%=ResourceManager.GetImageCDN("iagree.png")%>' />
这在.Net 4.0中可以使用,但我认为它在其他版本中也可以使用。我正在考虑一些避免代码落后的方法虽然这种方法可以使用,但缺点是它还增加了ViewState的大小(由于您正在检查!IsPostBack),因此无法禁用它)。这只输出实际标签,包括
<asp:ImageButton runat="server" OnClick="Agree" ImageUrl="<%=ResourceManager.GetImageCDN("iagree.png")%>" />
<asp:ImageButton runat="server" OnClick="Agree" ImageUrl='<%=ResourceManager.GetImageCDN("iagree.png")%>' />