这严格来说是一个IE7问题; IE8并不介意,FF也不介意。提交时,我们的表单会抛出以下异常:
Sys.ArgumentException: Cannot deserialize. The data does not correspond to valid JSON.
Parameter name: data
表格标题(为了保密而编辑;我们有一个偏执的NDA):
<%using (Ajax.BeginForm("...", "...", FormMethod.Post,
new AjaxOptions {
OnComplete = "OnSaveEditCommunitySuccess",
OnBegin = "OnBegin" },
new { id = "form_Edit...", name = "form_Edit..." }))
我暂时将一个处理程序附加到OnBegin,并查看了传递的json对象。我可以保证json.get_request().get_body()
与FF中的相同,并且正确地进行网络编码:
ProfileTabModel.IsEdit=true&ProfileTabModel.HandEnterCommunity=true&ProfileTabModel.CommunityId=26&ProfileTabModel.County=&ProfileTabModel.OrgId=7395& (...)
这可能是一个很大的形式,发送的数据至少是2500字节。我意识到它在POSt中无关紧要,即使它会,它与报告的错误无关,但最好提一下,因为在同一模式上编写的其他表单在发布数据时没有任何问题。
[编辑:]在调试时运行时,IE7不会在控制器中输入Action,而其他一切都在。忘了提这个。
答案 0 :(得分:3)
解决方案和摘要:
当需要对提交按钮进行编码时会出现问题。我们的按钮生成为<button ... ><span> Submit</span></button>
;当构建请求的时候,所有其他浏览器,包括IE8,都足够智能,只能“提交”。 IE7发送所有内部HTML。我们在其他上下文中遇到过这个错误,但这次我被JSON错误设置在错误的路径上。
我不能也不会从<% Http.Button %>
更改为输入;除此之外我甚至认为这是一个可行的解决方案;这个扩展是出于很好的理由使用,如果放弃它是一个选项,我首先不会问这个问题。
解决方案是添加新的过滤器,扩展RequestValidator
,并检查有问题的span
标记的请求;如果找到,请替换为文本。
public class HttpRequestValidator : RequestValidator
{
protected override bool IsValidRequestString(
HttpContext context,
string value,
RequestValidationSource requestValidationSource,
string collectionKey,
out int validationFailureIndex)
{
// Check if the Request.QueryString contains a post value of "<span>.....</span>"
if (requestValidationSource == RequestValidationSource.Form
&& !string.IsNullOrEmpty(value) && value.StartsWith("<span>",
StringComparison.InvariantCultureIgnoreCase))
{
var match = Regex.Match(value, @"\A<span>(.*?)</span>\Z",
RegexOptions.IgnoreCase);
if (match.Success && match.Groups.Count > 1)
return base.IsValidRequestString(
context, match.Groups[1].Value,
requestValidationSource,
collectionKey,
out validationFailureIndex);
}
return base.IsValidRequestString(
context,
value,
requestValidationSource,
collectionKey,
out validationFailureIndex);
}
}
您还需要在web.config
中添加它;搜索httpRuntime
并将其替换为
<httpRuntime requestPathInvalidCharacters="<,>,*,%,:,\"
requestValidationType=" ... .HttpRequestValidator"
maxRequestLength="40920" maxQueryStringLength="10000"/>
答案 1 :(得分:1)
您需要将json代码复制/粘贴到http://jsonlint.com/以检查其有效性并查看问题。
答案 2 :(得分:0)
也许您最好使用带有按钮类型的普通“输入”标签,因为它位于表单内。显然,IE 7将按钮的内部html作为其值,而许多其他浏览器使用“value”属性。