在ExtJS中,如果设置FormPanel的FileUpload为true后,在IE里,submit后就会变成以文件形式下载返回的Json字符串。在FireFox中就无法执行submit的success和failure的回调函数。
解决方法就是不要返回Json,返回Content。
即例如:
return Json(new
{
name = "Tom",
age = 18
});
return Content(new
{
name = "Tom",
age = 18
}.SerializeToJson());
使用下者,不要使用上者。
其中SerializeToJson的代码如下:
namespace System.Web.Script.Serialization
{
/// <summary>
/// 为启用 AFAX 的应用程序提供序列化和反序列化功能。
/// </summary>
public static partial class JsonHelper
{
private static readonly JavaScriptSerializer _jss;
static JsonHelper()
{
_jss = new JavaScriptSerializer();
}
/// <summary>
/// 将当前对象转换为 JSON 字符串。
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <returns>序列化的 JSON 字符串。</returns>
public static string SerializeToJson<T>(this T obj)
{
return _jss.Serialize(obj);
}
/// <summary>
/// 将指定的 JSON 字符串转换为 T 类型的对象。
/// </summary>
/// <typeparam name="T">所生成对象的类型。</typeparam>
/// <param name="input">要进行反序列化的 JSON 字符串。</param>
/// <returns>反序列化的对象。</returns>
public static T Deserialize<T>(string input)
{
return _jss.Deserialize<T>(input);
}
}
}
项目中记得引用System.Web和System.Web.Extensions。
然后前台页面的代码中submit不处理success回调函数。
对failure作如下处理:
failure: function(form, action) {
try {
/*
* 若转换对象过程中出现null,则是网络原因导致访问失败,在catch中处理
* 返回的文本会在前后分别添加"<PRE>"和"</PRE>",用replace替换掉(这里偷懒一下,正确的方式应该用substring)
* 接下来json字符串就可以转换回对象
*/
var returnObj = Ext.decode(action.response.responseText.replace('<PRE>', '').replace('</PRE>', ''));
} catch(e) {
// 网络原因访问失败的情况
}
}