在 MVC 中返回文件或 ajax 警报

Posted

技术标签:

【中文标题】在 MVC 中返回文件或 ajax 警报【英文标题】:Return either a file OR an ajax alert in MVC 【发布时间】:2011-09-07 23:58:32 【问题描述】:

假设我的主页上有一个包含多个选项的表单。其中之一是采用 customerID 的局部视图。如果 customerID 有效并且有产品,我会返回一个 CSV 文件,如下所示:

    public ActionResult CustomerProductsExport(string CustomerId)
    

        var export = "\"ProductID\"\n";

        IEnumerable<int> products = CustomerFactory.GetProducts(CustomerId);

        export += string.Join("\n", products);

        var aFileContent = Encoding.ASCII.GetBytes(export);
        var aMemoryStream = new MemoryStream(aFileContent);
        return File(aMemoryStream, "text/plain",
                    string.Format("0.csv", CustomerId));

    

但是,有几种情况会失败:客户 ID 不存在,或者他们没有产品。我只想返回一个 javascript 警报来指示这些情况中的任何一种。我已经尝试过 FormMethod.Get 和 .Post :

返回 Javascript("alert('foo');");

但这总是会产生一个文字字符串,而不是运行我的 javascript。如何在没有帖子的情况下获得我想要的行为或交付文件或发出 javascript 警报?我还尝试了提交按钮和 ActionLink... 相同的结果。

【问题讨论】:

【参考方案1】:

在这种情况下,我会返回表示结果的 JSON;如果成功,您将发出第二个请求以获取实际的文件资源。

你会这样做:

public ActionResult SomeMethod()

    if(EverythingIsOk)
      return Json(new  IsError = false, Url = "http://someUrl/" );

    return Json(new  IsError = true, Error = "You're doing it wrong" );

您的客户端收到 Json,然后检查是否有错误。如果不是,那么它会获取 Url 并请求该资源(因此,下载文件)。

【讨论】:

【参考方案2】:

如果您将内容类型设置为application/javascript,它应该可以工作

public ActionResult CustomerProductsExport(string CustomerId)

    var export = "\"ProductID\"\n";
    var products = CustomerFactory.GetProducts(CustomerId);
    if (products == null)
    
        return new ContentResult  
            Content = "alert('Invalid customer id');",
            ContentType = "application/javascript"
        ;
    

    export += string.Join("\n", products);

    var fileContent = Encoding.ASCII.GetBytes(export);
    var stream = new MemoryStream(fileContent);
    return File(stream, "text/plain",
                string.Format("0.csv", CustomerId));


编辑

JavascriptResult 使用过时的 application/x-javascript 标头,这可能是它无法按预期工作的原因。这就是上面的代码应该可以工作的原因。

查看这些问题:

Difference between application/x-javascript and text/javascript content types When serving JavaScript files, is it better to use the application/javascript or application/x-javascript

【讨论】:

以上是关于在 MVC 中返回文件或 ajax 警报的主要内容,如果未能解决你的问题,请参考以下文章

ajax 返回页面源,而不是消息

如何在 MVC4 中获取返回的 JSON 数据?

MVC Ajax 表单返回 View 的全部内容

mvc中的ajax jquery-方法返回不是布尔类型的True [重复]

MVC 控制器返回内容与返回 Json Ajax

当通过ajax mvc上传文件HttpPostedFileBase时返回null