1

我已使用以下 jQuery Ajax 代码将视图中的模型传递给控制器​​:

$.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()});
    }

我无法对电影 Enumerable 数据做任何事情。调用 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 帖子并弹出“完成”警报,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.NET MVC。

于 2012-06-06T10:46:45.370 回答