C# radgrid中的下载功能问题

C# radgrid中的下载功能问题,c#,asp.net,c#-4.0,telerik,telerik-grid,C#,Asp.net,C# 4.0,Telerik,Telerik Grid,我有一个棘手的问题,希望我能解释清楚 这里是我的问题:我有一个radgrid FormTemplate,用于添加/编辑行,其中我使用RadAsyncUpload控件上载文件。文件在插入和更新时已成功上载。此外,我在radgrid视图中配置了一个链接按钮,以便在需要时下载文件 现在的问题是:在上传文件后尝试从radgrid视图下载时,我无法下载它。相反,我需要先重新加载页面,然后才能下载文件。有什么问题吗?我还使用了grid.rebind()方法,但这不起作用。以下是我的代码的简要区域: <

我有一个棘手的问题,希望我能解释清楚

这里是我的问题:我有一个radgrid FormTemplate,用于添加/编辑行,其中我使用RadAsyncUpload控件上载文件。文件在插入和更新时已成功上载。此外,我在radgrid视图中配置了一个链接按钮,以便在需要时下载文件

现在的问题是:在上传文件后尝试从radgrid视图下载时,我无法下载它。相反,我需要先重新加载页面,然后才能下载文件。有什么问题吗?我还使用了grid.rebind()方法,但这不起作用。以下是我的代码的简要区域:

<Columns>
                        <telerik:GridButtonColumn Text="Download" HeaderText="Responsible" ItemStyle-ForeColor="Blue" CommandName="DownloadResponsibleAttachment" ColumnGroupName="Attachments"
                            ConfirmTextFields="ResponsibleAttachment" ConfirmTextFormatString="Would you like to download attachment?" HeaderStyle-Width="30px"
                            ConfirmDialogType="RadWindow" Reorderable="false" UniqueName="DownloadResponsibleAttachment" ConfirmTitle="File Download">
                        </telerik:GridButtonColumn>
                    </Columns>
                    <EditFormSettings EditFormType="Template">
                        <FormTemplate>
                            <p class="lbl" style="font: 10px verdana, arial; color: #166c92; font-weight: bold;">Responsible Attachment</p>
                            <telerik:RadAsyncUpload ID="attResponsible" runat="server" InitialFileInputsCount="1" MaxFileInputsCount="1" MaxFileSize="1048576"
                                 TargetFolder="~/Attachments" TemporaryFolder="~/Attachments" TemporaryFileExpiration="600000" ControlObjectsVisibility="None"
                                 OverwriteExistingFiles="true" ToolTip="You can only upload one file with maximum 1 MB." OnFileUploaded="attResponsible_FileUploaded" >
                            </telerik:RadAsyncUpload>

                            <div style="float:right; padding-top:20px;">
                            <asp:Button ID="btnUpdate" CssClass="btn" Text='<%# (Container is GridEditFormInsertItem) ? "Insert" : "Update" %>'
                                runat="server" CommandName='<%# (Container is GridEditFormInsertItem) ? "PerformInsert" : "Update" %>'></asp:Button>&nbsp;
                            <asp:Button ID="btnCancel" CssClass="btn" Text="Cancel" runat="server" CausesValidation="False"
                                CommandName="Cancel"></asp:Button>
                        </FormTemplate>
                    </EditFormSettings>

责任附件


如果要从启用了
AJAX的控件
中调用文件下载(放置在
RadAjaxPanel中或由RadAjaxManager
进行ajaxified),则不能使用正常的
response.WriteFile函数

Response.WriteFile("~/filename");
因为
XmlHttpRequest
无法处理此问题

编辑:

<div>
        <telerik:RadScriptManager ID="RadScriptManager1" runat="server">
        </telerik:RadScriptManager>
        <telerik:RadWindowManager ID="RadWindowManager1" runat="server">
        </telerik:RadWindowManager>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Always">
            <ContentTemplate>
                <telerik:RadGrid ID="RadGrid1" runat="server" AutoGenerateColumns="false" OnItemCommand="RadGrid1_ItemCommand"
                    OnNeedDataSource="RadGrid1_NeedDataSource" OnItemDataBound="RadGrid1_ItemDataBound">
                    <MasterTableView Width="950" AutoGenerateColumns="false" DataKeyNames="ID" GridLines="None"
                        TableLayout="Auto">
                        <Columns>
                            <telerik:GridBoundColumn DataField="ID" HeaderText="Emp ID" ReadOnly="true" HeaderStyle-HorizontalAlign="Left"
                                ItemStyle-HorizontalAlign="Left" UniqueName="ID" FilterControlWidth="30px" AutoPostBackOnFilter="true"
                                CurrentFilterFunction="Contains" />
                            <telerik:GridButtonColumn DataTextField="Name" ItemStyle-ForeColor="Blue" CommandName="Generate"
                                ConfirmTextFields="Name" ConfirmTextFormatString="Would you like to  {0} ACH file ?"
                                ConfirmDialogType="RadWindow" Reorderable="false" UniqueName="ButtonName" ConfirmTitle="ACH File">
                            </telerik:GridButtonColumn>
                        </Columns>
                    </MasterTableView>
                </telerik:RadGrid>
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>
protected void RadGrid1_NeedDataSource(object sender, GridNeedDataSourceEventArgs e)
    {
        dynamic data = new[] {
             new { ID = 1, Name ="Name_1"},
               new { ID = 2, Name = "Name_2"},
               new { ID = 3, Name = "Name_3"},
               new { ID = 4, Name = "Name_4"},
               new { ID = 5, Name = "Name_5"}
        };

        RadGrid1.DataSource = data;

    }


    protected void RadGrid1_ItemDataBound(object sender, GridItemEventArgs e)
    {
        if (e.Item is GridDataItem)
        {
            GridDataItem item = e.Item as GridDataItem;
            ScriptManager.GetCurrent(Page).RegisterPostBackControl(item["ButtonName"].Controls[0]);

        }
    }


    protected void RadGrid1_ItemCommand(object sender, Telerik.Web.UI.GridCommandEventArgs e)
    {
        if (e.CommandName == "Generate")
        {
            Response.ContentType = "text/plain";
            Response.AppendHeader("Content-Disposition", "attachment;filename= errorLog.txt");
            Response.AddHeader("content-length", "0");
            Response.Flush();
            Response.End();
        }
    }

ASPX代码:

<div>
        <telerik:RadScriptManager ID="RadScriptManager1" runat="server">
        </telerik:RadScriptManager>
        <telerik:RadWindowManager ID="RadWindowManager1" runat="server">
        </telerik:RadWindowManager>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Always">
            <ContentTemplate>
                <telerik:RadGrid ID="RadGrid1" runat="server" AutoGenerateColumns="false" OnItemCommand="RadGrid1_ItemCommand"
                    OnNeedDataSource="RadGrid1_NeedDataSource" OnItemDataBound="RadGrid1_ItemDataBound">
                    <MasterTableView Width="950" AutoGenerateColumns="false" DataKeyNames="ID" GridLines="None"
                        TableLayout="Auto">
                        <Columns>
                            <telerik:GridBoundColumn DataField="ID" HeaderText="Emp ID" ReadOnly="true" HeaderStyle-HorizontalAlign="Left"
                                ItemStyle-HorizontalAlign="Left" UniqueName="ID" FilterControlWidth="30px" AutoPostBackOnFilter="true"
                                CurrentFilterFunction="Contains" />
                            <telerik:GridButtonColumn DataTextField="Name" ItemStyle-ForeColor="Blue" CommandName="Generate"
                                ConfirmTextFields="Name" ConfirmTextFormatString="Would you like to  {0} ACH file ?"
                                ConfirmDialogType="RadWindow" Reorderable="false" UniqueName="ButtonName" ConfirmTitle="ACH File">
                            </telerik:GridButtonColumn>
                        </Columns>
                    </MasterTableView>
                </telerik:RadGrid>
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>
protected void RadGrid1_NeedDataSource(object sender, GridNeedDataSourceEventArgs e)
    {
        dynamic data = new[] {
             new { ID = 1, Name ="Name_1"},
               new { ID = 2, Name = "Name_2"},
               new { ID = 3, Name = "Name_3"},
               new { ID = 4, Name = "Name_4"},
               new { ID = 5, Name = "Name_5"}
        };

        RadGrid1.DataSource = data;

    }


    protected void RadGrid1_ItemDataBound(object sender, GridItemEventArgs e)
    {
        if (e.Item is GridDataItem)
        {
            GridDataItem item = e.Item as GridDataItem;
            ScriptManager.GetCurrent(Page).RegisterPostBackControl(item["ButtonName"].Controls[0]);

        }
    }


    protected void RadGrid1_ItemCommand(object sender, Telerik.Web.UI.GridCommandEventArgs e)
    {
        if (e.CommandName == "Generate")
        {
            Response.ContentType = "text/plain";
            Response.AppendHeader("Content-Disposition", "attachment;filename= errorLog.txt");
            Response.AddHeader("content-length", "0");
            Response.Flush();
            Response.End();
        }
    }

我应用了一个解决方案,以便在成功插入/更新记录时重新加载页面,如下所示:

protected void grid_ItemInserted(object source, GridInsertedEventArgs e)
    {
        if (e.Exception == null)
        {
            if (Session["FileUploaded"] != null)
                Response.Redirect(Request.RawUrl);
        }
    }

为了记录在案,我想就我遇到的问题发布这个答案。我找到了解决这个问题的方法。似乎RadAjaxManager有问题,所以我用RadAjaxPanel替换了它,它非常适合我。

嗯,我明白了,我使用了Response.WriteFile(“~/filename”);在我的代码背后。处理这个问题的替代方法是什么?我采用了与您推荐的方法相同的方法,但仍然出现错误。我很惊讶,当我重新加载我的页面时,我得到了同样的错误,但我仍然可以下载文件。我得到的错误如下:Data=无法计算表达式,因为代码已优化或本机帧位于调用堆栈顶部。​ 事先谢谢你,法瓦德·苏罗希先生也用了同样的方法,但不起作用。要添加到我的场景中,我没有使用UpdatePanel,但我使用的是RadAjaxManager。它必须工作。请检查我的更新答案。@FawadSurosh