Sitecore 中的 DevExpress 控件未回发
DevExpress controls in Sitecore not posting back
我在让 DevExpress 控件在 Sitecore (7.5) 中工作时遇到了一些问题。我已经通过在 Sitecore 解决方案之外的 aspx 页面(但在同一个 IIS 站点)中使用相同的代码来验证在 Sitecore 中使用控件是一个问题。
问题是在回发 DevExpress Combobox 控件时,我没有获得任何选定的值。我尝试了以下方法;
添加到 web.config:
<rendering>
<typesThatShouldNotBeExpanded>
<type>DevExpress.Web</type>
</typesThatShouldNotBeExpanded>
</rendering>
还尝试将 DXR.axd 添加到 web.config 中的 Sitecore "IgnoreUrlPrefixes" 设置。
我还尝试在 DevEx 控件上设置 EnableCallbackMode="false"。
这是我使用的测试代码,它在普通的 aspx 页面中工作,但不是子布局的一部分。
ASPX:
<%@ Register Assembly="DevExpress.Web.v14.2, Version=14.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web" TagPrefix="dx" %>
<%@ Register TagPrefix="sc" Namespace="Sitecore.Web.UI.WebControls" Assembly="Sitecore.Kernel" %>
<dx:ASPxPopupControl ID="ASPxPopupControl1" runat="server" ShowOnPageLoad="true">
<ContentCollection>
<dx:PopupControlContentControl>
<dx:ASPxFormLayout ID="ASPxFormLayout1" runat="server">
<Items>
<dx:LayoutGroup Caption="Testing">
<Items>
<dx:LayoutItem>
<LayoutItemNestedControlCollection>
<dx:LayoutItemNestedControlContainer>
<dx:ASPxLabel runat="server" Text="ASPxLabel" AssociatedControlID="ComboBox"></dx:ASPxLabel>
<dx:ASPxComboBox ID="ASPxComboBoxLoja" runat="server" CssFilePath="~/App_Themes/DevEx/{0}/styles.css"
CssPostfix="DevEx" ValueField="codigo" SpriteCssFilePath="~/App_Themes/DevEx/{0}/sprite.css"
ValueType="System.Guid" ClientIDMode="AutoID" Spacing="0" EnableCallbackMode="false">
<LoadingPanelImage Url="~/App_Themes/DevEx/Editors/Loading.gif">
</LoadingPanelImage>
<Columns>
<dx:ListBoxColumn Caption="Loja" FieldName="nome" />
</Columns>
<LoadingPanelStyle ImageSpacing="5px">
</LoadingPanelStyle>
</dx:ASPxComboBox>
</dx:LayoutItemNestedControlContainer>
</LayoutItemNestedControlCollection>
</dx:LayoutItem>
</Items>
</dx:LayoutGroup>
<dx:LayoutItem>
<LayoutItemNestedControlCollection>
<dx:LayoutItemNestedControlContainer>
<dx:ASPxButton runat="server" Text="ASPxButton" OnClick="Button_Click"></dx:ASPxButton>
</dx:LayoutItemNestedControlContainer>
</LayoutItemNestedControlCollection>
</dx:LayoutItem>
</Items>
</dx:ASPxFormLayout>
<asp:Literal Text="" runat="server" ID="Output" />
</dx:PopupControlContentControl>
</ContentCollection>
</dx:ASPxPopupControl>
CS:
protected void Page_Load(object sender, EventArgs e)
{
ASPxComboBoxLoja.DataSource = CreateRightListDataSource();
ASPxComboBoxLoja.DataBind();
}
private IEnumerable CreateRightListDataSource()
{
for (int i = 0; i < 100; i++)
{
yield return new { codigo = Guid.NewGuid(), nome = "nome " + i };
}
}
protected void Button_Click(object sender, EventArgs e)
{
string retVal = ASPxComboBoxLoja.Value.ToString();
Output.Text = retVal;
}
点击按钮尝试检索值时发生错误。它为空(与所选项目一样)。屏幕上/Sitecore 日志中的错误:
异常:System.NullReferenceException
消息:未将对象引用设置为对象的实例。
有没有让 DevExpress 控件在 Sitecore 中工作的经验?我确定我在做一些愚蠢的事情。
非常感谢。
不完全确定,但这感觉像是 postbacks.You 的 .NET 事件循环问题在每次页面加载时重新绑定数据源,甚至是回发。这通常会扰乱视图状态。您是否尝试过使用 if(!IsPostBack)
包装数据绑定?
编辑: 我刚刚还注意到您每次呈现页面时都会生成一个新的 GUID。我不确定 Codigo 是什么,但您的第一次加载的 GUID 与回发时的 GUID 不同。
感谢您的帮助。我设法通过更改配置中的 AutomaticDataBind 设置来解决问题。即 SC 包含文件:
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
<sitecore>
<settings>
<setting name="AutomaticDataBind">
<patch:attribute name="value">true</patch:attribute>
</setting>
</settings>
</sitecore>
</configuration>
改变<typesThatShouldNotBeExpanded>
似乎是正确的做法;不过好像没什么效果。
我在让 DevExpress 控件在 Sitecore (7.5) 中工作时遇到了一些问题。我已经通过在 Sitecore 解决方案之外的 aspx 页面(但在同一个 IIS 站点)中使用相同的代码来验证在 Sitecore 中使用控件是一个问题。
问题是在回发 DevExpress Combobox 控件时,我没有获得任何选定的值。我尝试了以下方法;
添加到 web.config:
<rendering>
<typesThatShouldNotBeExpanded>
<type>DevExpress.Web</type>
</typesThatShouldNotBeExpanded>
</rendering>
还尝试将 DXR.axd 添加到 web.config 中的 Sitecore "IgnoreUrlPrefixes" 设置。 我还尝试在 DevEx 控件上设置 EnableCallbackMode="false"。
这是我使用的测试代码,它在普通的 aspx 页面中工作,但不是子布局的一部分。
ASPX:
<%@ Register Assembly="DevExpress.Web.v14.2, Version=14.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web" TagPrefix="dx" %>
<%@ Register TagPrefix="sc" Namespace="Sitecore.Web.UI.WebControls" Assembly="Sitecore.Kernel" %>
<dx:ASPxPopupControl ID="ASPxPopupControl1" runat="server" ShowOnPageLoad="true">
<ContentCollection>
<dx:PopupControlContentControl>
<dx:ASPxFormLayout ID="ASPxFormLayout1" runat="server">
<Items>
<dx:LayoutGroup Caption="Testing">
<Items>
<dx:LayoutItem>
<LayoutItemNestedControlCollection>
<dx:LayoutItemNestedControlContainer>
<dx:ASPxLabel runat="server" Text="ASPxLabel" AssociatedControlID="ComboBox"></dx:ASPxLabel>
<dx:ASPxComboBox ID="ASPxComboBoxLoja" runat="server" CssFilePath="~/App_Themes/DevEx/{0}/styles.css"
CssPostfix="DevEx" ValueField="codigo" SpriteCssFilePath="~/App_Themes/DevEx/{0}/sprite.css"
ValueType="System.Guid" ClientIDMode="AutoID" Spacing="0" EnableCallbackMode="false">
<LoadingPanelImage Url="~/App_Themes/DevEx/Editors/Loading.gif">
</LoadingPanelImage>
<Columns>
<dx:ListBoxColumn Caption="Loja" FieldName="nome" />
</Columns>
<LoadingPanelStyle ImageSpacing="5px">
</LoadingPanelStyle>
</dx:ASPxComboBox>
</dx:LayoutItemNestedControlContainer>
</LayoutItemNestedControlCollection>
</dx:LayoutItem>
</Items>
</dx:LayoutGroup>
<dx:LayoutItem>
<LayoutItemNestedControlCollection>
<dx:LayoutItemNestedControlContainer>
<dx:ASPxButton runat="server" Text="ASPxButton" OnClick="Button_Click"></dx:ASPxButton>
</dx:LayoutItemNestedControlContainer>
</LayoutItemNestedControlCollection>
</dx:LayoutItem>
</Items>
</dx:ASPxFormLayout>
<asp:Literal Text="" runat="server" ID="Output" />
</dx:PopupControlContentControl>
</ContentCollection>
</dx:ASPxPopupControl>
CS:
protected void Page_Load(object sender, EventArgs e)
{
ASPxComboBoxLoja.DataSource = CreateRightListDataSource();
ASPxComboBoxLoja.DataBind();
}
private IEnumerable CreateRightListDataSource()
{
for (int i = 0; i < 100; i++)
{
yield return new { codigo = Guid.NewGuid(), nome = "nome " + i };
}
}
protected void Button_Click(object sender, EventArgs e)
{
string retVal = ASPxComboBoxLoja.Value.ToString();
Output.Text = retVal;
}
点击按钮尝试检索值时发生错误。它为空(与所选项目一样)。屏幕上/Sitecore 日志中的错误:
异常:System.NullReferenceException 消息:未将对象引用设置为对象的实例。
有没有让 DevExpress 控件在 Sitecore 中工作的经验?我确定我在做一些愚蠢的事情。
非常感谢。
不完全确定,但这感觉像是 postbacks.You 的 .NET 事件循环问题在每次页面加载时重新绑定数据源,甚至是回发。这通常会扰乱视图状态。您是否尝试过使用 if(!IsPostBack)
包装数据绑定?
编辑: 我刚刚还注意到您每次呈现页面时都会生成一个新的 GUID。我不确定 Codigo 是什么,但您的第一次加载的 GUID 与回发时的 GUID 不同。
感谢您的帮助。我设法通过更改配置中的 AutomaticDataBind 设置来解决问题。即 SC 包含文件:
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
<sitecore>
<settings>
<setting name="AutomaticDataBind">
<patch:attribute name="value">true</patch:attribute>
</setting>
</settings>
</sitecore>
</configuration>
改变<typesThatShouldNotBeExpanded>
似乎是正确的做法;不过好像没什么效果。