Sitecore中的DevExpress控件不回发

时间:2015-05-11 20:02:31

标签: devexpress sitecore

我在使用Sitecore(7.5)中的DevExpress控件时遇到了一些问题。我已经通过在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页面中工作,但不是Sublayout的一部分。

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中工作的经验?我确定我做的事情很糟糕。

非常感谢。

2 个答案:

答案 0 :(得分:0)

不完全确定,但这感觉就像一个带有回发的.NET事件周期问题。你在每个页面加载时重新绑定数据源,甚至是回发。这通常会使视图状态变得混乱。您是否尝试使用if(!IsPostBack)包装数据绑定?

编辑:我还注意到,每次渲染页面时都会生成新的GUID。我不确定Codigo是什么,但是你的第一个加载将具有与回发不同的GUID。

答案 1 :(得分:0)

感谢您的帮助。我设法通过更改配置中的AutomaticDataBind设置来解决此问题。即SC包含文件:

@BP.route('/run/<int:mylongprocess_id>')
@login_required
def run(mylongprocess_id):
    mylongprocess = mylongprocess.query.get_or_404(mylongprocess_id)
    project = Project.query.get_or_404(mylongprocess.project_id)
    check_rights(current_user, project, 'user', 404)
    A, lcs = _create_analysis(mylongprocess)
    @copy_current_request_context
    def gen(mylongprocess, nodeid, store_path):
        print('now runing %s' % A)
        for (loopnb, total_loops, pct, lclabel) in A.runiterator(lcs):
            print('ran %d/%d (%.1f%%) "%s"' % (loopnb, total_loops,
                                               pct, lclabel))
            progress = ('data: %s!!%f!!%s!!%f!!%s\n\n' %
                        (nodeid, pct, lclabel, 0, 'waiting...'))
            yield progress
        print('now postprocessing %s' % A)
        postpro = load_node(store_path, node_id=nodeid)
        for step, total, pct, action in postpro._builditer(target='web',
                                                       buildfile=None):
            progress = ('data: %s!!%f!!%s!!%f!!%s\n\n' %
                        (nodeid, 100, 'ok',  pct, action.replace('_', ' ')))
            yield progress
        print('now terminating %s' % A)
        _terminate_analysis(A, mylongprocess)

    return Response(gen(mylongprocess, mylongprocess.nodeid), mimetype='text/event-stream')

改变<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/"> <sitecore> <settings> <setting name="AutomaticDataBind"> <patch:attribute name="value">true</patch:attribute> </setting> </settings> </sitecore> </configuration> 似乎是正确的做法;但它似乎没有效果。