从 <%# %> 获取值
Getting value from <%# %>
<cms:CMSRepeater ID="rptTopic" runat="server" SelectOnlyPublished="true" OrderBy="NodeLevel,NodeOrder" ClassNames='<%# CLASS_NAME %>' Path='<%# Path %>'>
CLASS_NAME
和 Path
的值是在后端预定义的。但我仍然遇到错误。
我的代码有什么问题吗?
下面是全部代码。
<cms:CMSRepeater ID="CMSRepeater1" runat="server" SelectOnlyPublished="true" OrderBy="NodeLevel,NodeOrder" ClassNames='<%# CLASS_NAME %>' Path='<%# Path %>'>
<ItemTemplate>
<div class="col-md-3">
<div class="panel panel-default">
<asp:Image ID="imgTopic" runat="server" Height="200px" Width="100%" ImageUrl='<%# Eval("BackgroundImage") %>' />
<h4><%# Eval("Title") %></h4>
<p><%# Eval("Descriptions") %></p>
<a class="btn" href='<%# Eval("UrlLink") %>'>
<%# Eval("UrlText") %>
</a>
</div>
</div>
</ItemTemplate>
</cms:CMSRepeater>
这是我遇到的异常:
Message: DataBinding: 'System.Data.DataRowView' does not contain a property with the name 'BackgroundImage'.
Exception type: System.Web.HttpException
Stack trace:
at System.Web.UI.DataBinder.GetPropertyValue(Object container, String propName)
at System.Web.UI.DataBinder.Eval(Object container, String[] expressionParts)
at System.Web.UI.DataBinder.Eval(Object container, String expression)
at System.Web.UI.TemplateControl.Eval(String expression)
at CMS.Base.Web.UI.AbstractUserControl.Eval(String column)
at ASP.inteksoft_webparts_content_topiclisting_ascx.__DataBinding__control3(Object sender, EventArgs e) in C:\Users\yjseow\Desktop\inteksoft svn\trunk\MOT\MOT.Website\Website\CMS\Inteksoft\WebParts\Content\TopicListing.ascx:line 9
at System.Web.UI.Control.OnDataBinding(EventArgs e)
at System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding)
at System.Web.UI.Control.DataBind()
at System.Web.UI.Control.DataBindChildren()
at System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding)
at System.Web.UI.Control.DataBind()
at System.Web.UI.WebControls.Repeater.CreateItem(Int32 itemIndex, ListItemType itemType, Boolean dataBind, Object dataItem)
at System.Web.UI.WebControls.Repeater.AddDataItemsIntoItemsArray(IEnumerable dataSource, Boolean useDataSource)
at System.Web.UI.WebControls.Repeater.PostGetDataAction(IEnumerable dataSource)
at System.Web.UI.WebControls.Repeater.CreateControlHierarchy(Boolean useDataSource)
at CMS.DocumentEngine.Web.UI.BasicRepeater.CreateControlHierarchy(Boolean useDataSource)
at System.Web.UI.WebControls.Repeater.OnDataBinding(EventArgs e)
at System.Web.UI.WebControls.Repeater.DataBind()
at CMS.DocumentEngine.Web.UI.BasicRepeater.DataBind()
at CMS.DocumentEngine.Web.UI.CMSRepeater.DataBind()
at CMS.DocumentEngine.Web.UI.CMSRepeater.ReloadDataInternal(Boolean forceReload)
at CMS.DocumentEngine.Web.UI.CMSRepeater.<>c__DisplayClass3.b__2()
at CMS.Base.Web.UI.ControlsExtensions.CallHandled(Control ctrl, Action func)
根据我得到的异常,在我检查我的列字段名称是否正确后,我怀疑我无法指向正确的 class 名称。
一旦我从 ClassNames='<%# CLASS_NAME %>' Path='<%# Path %>'>
切换到 ClassNames="CMS.Topic" Path="/Shared/Topic/%"
,那么一切顺利。
我正在努力使 ClassNames
和 Path
变得动态可控。
下次从事件日志中添加日志。
尝试:
<cms:CMSRepeater ID="rptTopic" runat="server" SelectOnlyPublished="true" OrderBy="NodeLevel,NodeOrder" ClassNames='<%# CLASS_NAME %>' Path='<%# Path %>' />
注意括号结束前的斜杠字符。
编辑:
尝试使用
<%# Eval("ClassName")%>
如果 CLASS_NAME 和 Path Path 是代码隐藏文件中的属性,您可以尝试在页面加载时在代码隐藏文件中使用它们初始化转发器。喜欢 rptTopic.ClassNames = CLASS_NAME;
和 rptTopic.Path = Path
。或者使用 <%=...%>
代替 <%#...%>
<cms:CMSRepeater ID="CMSRepeater1" runat="server" SelectOnlyPublished="true" OrderBy="NodeLevel,NodeOrder" ClassNames='<%= CLASS_NAME %>' Path='<%= Path %>'/>
由于注释不能包含代码标签,如果你需要设置一个 Repeater 的值超过你在 inline 标签中所能做的,你可以这样做:
<cms:CMSRepeater ID="rptTopic" runat="server" SelectOnlyPublished="true" OrderBy="NodeLevel,NodeOrder" />
<script runat="server">
protected override void OnInit(EventArgs e)
{
rptTopic.ClassName = CMS.Helpers.ValidationHelper.GetString(Eval("ClassName"),"");
rptTopic.Path = CMS.Helpers.ValidationHelper.GetString(Eval("Path"),"");
}
</script>
<cms:CMSRepeater ID="rptTopic" runat="server" SelectOnlyPublished="true" OrderBy="NodeLevel,NodeOrder" ClassNames='<%# CLASS_NAME %>' Path='<%# Path %>'>
CLASS_NAME
和 Path
的值是在后端预定义的。但我仍然遇到错误。
我的代码有什么问题吗?
下面是全部代码。
<cms:CMSRepeater ID="CMSRepeater1" runat="server" SelectOnlyPublished="true" OrderBy="NodeLevel,NodeOrder" ClassNames='<%# CLASS_NAME %>' Path='<%# Path %>'>
<ItemTemplate>
<div class="col-md-3">
<div class="panel panel-default">
<asp:Image ID="imgTopic" runat="server" Height="200px" Width="100%" ImageUrl='<%# Eval("BackgroundImage") %>' />
<h4><%# Eval("Title") %></h4>
<p><%# Eval("Descriptions") %></p>
<a class="btn" href='<%# Eval("UrlLink") %>'>
<%# Eval("UrlText") %>
</a>
</div>
</div>
</ItemTemplate>
</cms:CMSRepeater>
这是我遇到的异常:
Message: DataBinding: 'System.Data.DataRowView' does not contain a property with the name 'BackgroundImage'.
Exception type: System.Web.HttpException
Stack trace:
at System.Web.UI.DataBinder.GetPropertyValue(Object container, String propName)
at System.Web.UI.DataBinder.Eval(Object container, String[] expressionParts)
at System.Web.UI.DataBinder.Eval(Object container, String expression)
at System.Web.UI.TemplateControl.Eval(String expression)
at CMS.Base.Web.UI.AbstractUserControl.Eval(String column)
at ASP.inteksoft_webparts_content_topiclisting_ascx.__DataBinding__control3(Object sender, EventArgs e) in C:\Users\yjseow\Desktop\inteksoft svn\trunk\MOT\MOT.Website\Website\CMS\Inteksoft\WebParts\Content\TopicListing.ascx:line 9
at System.Web.UI.Control.OnDataBinding(EventArgs e)
at System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding)
at System.Web.UI.Control.DataBind()
at System.Web.UI.Control.DataBindChildren()
at System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding)
at System.Web.UI.Control.DataBind()
at System.Web.UI.WebControls.Repeater.CreateItem(Int32 itemIndex, ListItemType itemType, Boolean dataBind, Object dataItem)
at System.Web.UI.WebControls.Repeater.AddDataItemsIntoItemsArray(IEnumerable dataSource, Boolean useDataSource)
at System.Web.UI.WebControls.Repeater.PostGetDataAction(IEnumerable dataSource)
at System.Web.UI.WebControls.Repeater.CreateControlHierarchy(Boolean useDataSource)
at CMS.DocumentEngine.Web.UI.BasicRepeater.CreateControlHierarchy(Boolean useDataSource)
at System.Web.UI.WebControls.Repeater.OnDataBinding(EventArgs e)
at System.Web.UI.WebControls.Repeater.DataBind()
at CMS.DocumentEngine.Web.UI.BasicRepeater.DataBind()
at CMS.DocumentEngine.Web.UI.CMSRepeater.DataBind()
at CMS.DocumentEngine.Web.UI.CMSRepeater.ReloadDataInternal(Boolean forceReload)
at CMS.DocumentEngine.Web.UI.CMSRepeater.<>c__DisplayClass3.b__2()
at CMS.Base.Web.UI.ControlsExtensions.CallHandled(Control ctrl, Action func)
根据我得到的异常,在我检查我的列字段名称是否正确后,我怀疑我无法指向正确的 class 名称。
一旦我从 ClassNames='<%# CLASS_NAME %>' Path='<%# Path %>'>
切换到 ClassNames="CMS.Topic" Path="/Shared/Topic/%"
,那么一切顺利。
我正在努力使 ClassNames
和 Path
变得动态可控。
下次从事件日志中添加日志。 尝试:
<cms:CMSRepeater ID="rptTopic" runat="server" SelectOnlyPublished="true" OrderBy="NodeLevel,NodeOrder" ClassNames='<%# CLASS_NAME %>' Path='<%# Path %>' />
注意括号结束前的斜杠字符。
编辑: 尝试使用
<%# Eval("ClassName")%>
如果 CLASS_NAME 和 Path Path 是代码隐藏文件中的属性,您可以尝试在页面加载时在代码隐藏文件中使用它们初始化转发器。喜欢 rptTopic.ClassNames = CLASS_NAME;
和 rptTopic.Path = Path
。或者使用 <%=...%>
代替 <%#...%>
<cms:CMSRepeater ID="CMSRepeater1" runat="server" SelectOnlyPublished="true" OrderBy="NodeLevel,NodeOrder" ClassNames='<%= CLASS_NAME %>' Path='<%= Path %>'/>
由于注释不能包含代码标签,如果你需要设置一个 Repeater 的值超过你在 inline 标签中所能做的,你可以这样做:
<cms:CMSRepeater ID="rptTopic" runat="server" SelectOnlyPublished="true" OrderBy="NodeLevel,NodeOrder" />
<script runat="server">
protected override void OnInit(EventArgs e)
{
rptTopic.ClassName = CMS.Helpers.ValidationHelper.GetString(Eval("ClassName"),"");
rptTopic.Path = CMS.Helpers.ValidationHelper.GetString(Eval("Path"),"");
}
</script>