1

次のjQueryAjaxコードを使用して、ビュー内のモデルをコントローラーに渡しました。

$.ajax({
        data: model,
        type: "POST",
        url: '@Url.Action("createDoc")',
        datatype: "json",
        contentType: "application/json; charset=utf-8",
        success: function (result) {
            alert('Done '+ result.toString());
        }
    });

問題は次のとおりです。Controllerメソッド「createDoc」

[HttpPost]
    public ActionResult createDoc(IEnumerable<Movie> movies)
    {
        CreateWordprocessingDocument(movies);
        return Json(new { result = movies.Count()});
    }

映画の列挙可能なデータでは何もできません。CreateWordProcessingDocumentを呼び出すと、映画データを含むドキュメントが作成されます。しかし、そうではありません。これはメソッドコードです:

public void CreateWordprocessingDocument(IEnumerable<Movie> movies)
{
    HttpContextWrapper context = new HttpContextWrapper(System.Web.HttpContext.Current);
    context.Response.Clear();
    context.Response.Buffer = true;
    context.Response.AddHeader("content-disposition", "attachment;filename=example.doc");
    context.Response.ContentType = "application/vnd.ms-word.document";
    context.Response.Charset = "";
    StringBuilder sb = new StringBuilder();
    sb.AppendLine("<p  align='Center'><b> GENERAL TITLE</b></p>");
    sb.Append("<br>"+movies.Count());
    for (int i = 0; i < movies.Count(); i++) {
        sb.Append("<br>Title:" + movies.ElementAt(i).Title +"");
    }
    context.Response.Output.Write(sb.ToString());
    context.Response.Flush();
    context.Response.End();
}

ただし、機能しません。ajaxの投稿に戻り、「Done」アラートがポップアップ表示されます。result.tostring()には、createWordProcessingDocumentメソッドで作成したHTMLコードが表示されます。ビューからコントローラーに渡したデータを使用して何かを実行できるように、この動作を回避するにはどうすればよいですか?ありがとう。

4

3 に答える 3

1

ASP.net MVCにはFileResult、mimeタイプのファイルをブラウザーに返すためのが含まれています。

代わりに次のようなことをしてください:

public ActionResult  createDoc(IEnumerable<Movie> movies)
{
    byte[] fileContents = CreateFileFromMovies(movies);

    return File(fileContents, "application/vnd.ms-word.document");
}

応答に直接アクセスする代わりに、ドキュメントをバイト配列として作成し、File()メソッドを使用してコンテンツを返します。

于 2012-06-06T13:58:36.270 に答える
1

問題が解決しました:問題の解決策が誰かに役立つ場合は、ここに解決策を投稿します。createDocメソッドでは、必要なデータを使用して文字列を作成し、それらをtempDataプロパティに配置します。createDocは次のようになります。

[HttpPost]
    public void createDoc(IEnumerable<Movie> movies)
    {
        String mov="";
        mov = mov + "<br>" + movies.Count();
        for (int i = 0; i < movies.Count(); i++)
        {
           mov=mov+"<br>Title:" + movies.ElementAt(i).Title + "";
        }
        TempData["movies"] = mov;
    }

次に、「コントロール」はAjax postメソッドに戻り、最後に次のように配置します。

success: function (result) {
            window.location.href = '@Url.Action("CreateWordprocessingDocument","Movies")'
        }

したがって、私のAjax投稿の完全なコードは次のとおりです。

<script type="text/javascript">
function postData() {
    var urlact = '@Url.Action("createDoc")';
    var model = '@Html.Raw(Json.Encode(Model))';

    alert(model);
    alert(JSON.stringify(model));

    $.ajax({
        data: model,
        type: "POST",
        url: urlact,
        datatype: "json",
        contentType: "application/json; charset=utf-8",
        success: function (result) {
            window.location.href = '@Url.Action("CreateWordprocessingDocument","Movies")'
        }
    });
}
</script>

これで、「コントロール」はCreateWordProcessingDocumentアクションにリダイレクトされ、実際にドキュメントを作成します。

public void CreateWordprocessingDocument()
    {
        string movies = TempData["movies"] as string;
        context.Response.Clear();
        context.Response.Buffer = true;
        context.Response.AddHeader("content-disposition", "attachment;filename=example.doc");
        context.Response.ContentType = "application/vnd.ms-word.document";
        context.Response.Charset = "";
        StringBuilder sb = new StringBuilder();
        sb.AppendLine("<p  align='Center'><b>TITLE</b></p>");
        sb.Append(movies);
        context.Response.Output.Write(sb.ToString());
        context.Response.Flush();
        context.Response.End();
    }

それで全部です。あなたの助けに感謝します、私がこの解決策で誰かを助けることができることを願っています。

于 2012-06-08T07:18:44.397 に答える
0

CreateWordprocessingDocumentで作成したHTMLコードを取得する理由は、それがHTTP応答に直接出力するものだからです。その後、応答を終了しました。基本的に、応答を自分で直接書き込むことにより、多くのASP.NETMVCをバイパスしました。

于 2012-06-06T10:46:45.370 に答える