3

ASP.NET プロジェクトを .NET 2.0 から 4.0 にアップグレードしました。まだ MVC 2 を使用しています。.csv ファイルを送り返す一部の機能は、(奇妙なことに) ビューとして記述されていました。次に、MainContentPlaceHolder セクションで、コードはマスターからすべてのコンテンツを破棄します。

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/MyMaster" Inherits="System.Web.Mvc.ViewPage<MyViewModel>" %>

<%
    HttpContext context = HttpContext.Current;
    context.Response.Clear();
    context.Response.Write(Html.CompletionByTemplateExport((CompletionByTemplateExport)ViewData["report"]));
    context.Response.ContentType = "text/csv";
    context.Response.AppendHeader("Content-Disposition", "attachment; filename=CompletionByTemplateReport.csv");
    context.Response.End();
 %>

.NET 4.0 へのアップグレード後、この回避策は機能しなくなります。.csv ファイルには、マスター ページによって出力されたすべての html コンテンツが含まれます。

.NET 4.0 へのアップグレードで、要求と応答の処理方法はどのように変更されましたか? response.Clear() と Response.End() が以前と同じように機能するように、古い方法で動作させる方法はありますか? .csv-downloading 機能が書き換えられるまでの短期的な解決策を探しています。

4

2 に答える 2

2

正確な方法はわかりませんが、ページのライフサイクルが .NET 2.0 と .NET 4.0 の間でわずかに変化したようです。問題を再現できました。

あなたの見解は次のようになると思います:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/MyMaster" Inherits="System.Web.Mvc.ViewPage<MyViewModel>" %>

<asp:Content Id="MainContent1" ContentPlaceHolderID="MainContent">
<%
    HttpContext context = HttpContext.Current;
    context.Response.Clear();
    context.Response.Write(Html.CompletionByTemplateExport((CompletionByTemplateExport)ViewData["report"]));
    context.Response.ContentType = "text/csv";
    context.Response.AppendHeader("Content-Disposition", "attachment; filename=CompletionByTemplateReport.csv");
    context.Response.End();
 %>
</asp:Content>

残念ながら、次のようなことをしなければならないと思います:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/MyMaster" Inherits="System.Web.Mvc.ViewPage<MyViewModel>" %>

<script runat="server">
void Page_Load(object sender, EventArgs args) {
    HttpContext context = HttpContext.Current;
    context.Response.Clear();
    context.Response.Write(Html.CompletionByTemplateExport((CompletionByTemplateExport)ViewData["report"]));
    context.Response.ContentType = "text/csv";
    context.Response.AppendHeader("Content-Disposition", "attachment; filename=CompletionByTemplateReport.csv");
    context.Response.End();
 }
</script>

または (できれば)、そのコードをコントローラーに移動します (これは MVC であるため):

public class MyController : Controller
{
    public ActionResult Index()
    {
        // This is redundant, Controllers and Views have a Response property
        // HttpContext context = HttpContext.Current;
        CompletionByTemplateExport reportData = ...;
        Response.Clear();
        Response.Write(Html.CompletionByTemplateExport(reportData));
        Response.ContentType = "text/csv";
        Response.AppendHeader("Content-Disposition", "attachment; filename=CompletionByTemplateReport.csv");
        Response.End();   
    }
}

どちらも、マスター ページの HTML を含まない CSV のみを提供します。

于 2013-06-06T16:15:10.027 に答える