簡體   English   中英

使用.ajaxForm和C#MVC,如何防止Internet Explorer嘗試保存Json結果?

[英]Using .ajaxForm and C# MVC, how can I prevent Internet Explorer from trying to save Json result?

我通過C#MVC控制器返回一些Json。 其他瀏覽器工作正常,但Internet Explorer(IE9)嘗試將返回的Json數據保存為文本文件。 任何想法如何防止這種情況發生?

//MVC Controller Code...
return Json(new { redirectToUrl = Url.Action("Create", "Album",
                  new { url = url, isLocalFile = isLocalFile})});

//Clientside Javascript Code
$("#uploadImageForm").ajaxForm({
  beforeSubmit: function () {

  },
  success: function (data, textStatus, xhr) {
          window.location.href = data.redirectToUrl;
  },
  error: function (data, textStatus, xhr) {
  } 
});

我已經嘗試將“text / plain”和“text / json”添加到返回Json方法的第二個參數中,但它不起作用。

非常感謝!

引用jquery.form插件的文檔

支持XMLHttpRequest Level 2的瀏覽器將能夠無縫上傳文件,甚至可以在上傳過程中獲得進度更新。 對於較舊的瀏覽器,使用了涉及iframe的回退技術,因為無法使用XMLHttpRequest對象的1級implmentntation上傳文件。 這是一種常見的后備技術,但它具有固有的局限性。 iframe元素用作表單提交操作的目標,這意味着服務器響應被寫入iframe。 如果響應類型是HTML或XML,這很好,但如果響應類型是腳本或JSON,則這兩種方法都不起作用,這兩種方法通常都包含在HTML標記中找到時需要使用實體引用來重復的字符。

為了解決使用iframe模式時腳本和JSON響應的挑戰,Form Plugin允許將這些響應嵌入到textarea元素中,建議您在與文件上傳和更早版本結合使用時對這些響應類型執行此操作。瀏覽器。 但請注意,如果表單中沒有文件輸入,則請求使用普通XHR提交表單(而不是iframe)。 這會給您的服務器代碼帶來負擔,以便知道何時使用textarea以及何時不使用。

這意味着如果表單包含文件輸入字段,並且您要將此表單提交給返回JSON的控制器操作,則必須將此JSON包裝在<textarea>標記中。

所以你的回答不應該是這樣的:

{ "redirectToUrl":"some url" }

它應該是這樣的:

<textarea>{ "redirectToUrl":"some url" }</textarea>

為了實現這一目標,您可以使用自定義操作結果,該結果將使用這些標記包裝響應:

public class TextareaJsonResult : JsonResult
{
    public TextareaJsonResult(object data)
    {
        this.Data = data;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        var response = context.HttpContext.Response;
        bool shouldWrap = !context.HttpContext.Request.IsAjaxRequest();
        if (shouldWrap)
        {
            response.Write("<textarea>");
        }

        base.ExecuteResult(context);

        if (shouldWrap)
        {
            response.ContentType = "text/html";
            response.Write("</textarea>");
        }
    }
}

然后讓控制器操作返回此自定義結果:

[HttpPost]
public ActionResult Upload(HttpPostedFileBase file)
{
    // ... some processing

    var redirectToUrl = Url.Action(
        "Create", 
        "Album",
        new { url = url, isLocalFile = isLocalFile }
    );
    return new TextareaJsonResult(new { redirectToUrl = redirectToUrl });
}

現在顯然在您的AJAX成功回調中,您還需要通過測試typeof result來解釋這種差異,並且在舊版瀏覽器(例如Internet Explorer)的情況下,手動解析響應。 您可以查看我鏈接到的頁面的源代碼。

但話雖如此,我可以看到,在您的成功回調中,您將重定向到服務器返回的JSON響應中包含的控制器操作。 我的問題出現了:如果您要重定向,首先使用AJAX有什么意義? 為什么不使用標准表單發布到控制器操作並讓控制器操作直接執行重定向? 當你想要留在同一頁面時,應該使用AJAX。

我同意Jesse的評論,這可能與他提供的鏈接重復。

因此我會提供另一種選擇。 我更喜歡使用類似於fiddler http://www.fiddler2.com/fiddler2/的http代理來查看json。 我提到了提琴手,因為它適用於所有瀏覽器。 優點是您獲得了解析的json的樹視圖。 它更容易閱讀和找到你正在尋找的東西。

此外,我相信firefox,chrome dev工具和開發工具的firebug都提供相同的功能。 (我知道chrome有樹視圖,我想我記得firebug有它,如果現代IE沒有考慮到其他2,我會感到驚訝。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM