1

我有 ac#.net MVC 应用程序。我正在使用 jQuery UI 自动完成。我创建了一个有效的 JSON 字符串以发送到自动完成并将其添加到视图中,如下所示:

$(document).ready(function() {
    autoCompleteParams[@Model.Id] = jQuery.parseJSON(@Html.Raw(Json.Encode(Model.ParamValueListJson)));
    // Handles onchange for autocomplete
    $reports.initParamList('@Model.Id');
});

当我检查 的值ParamValueListJson并通过JSON验证运行它时,它是一个有效的字符串。但是,它很长。粘贴到 Word 中时,它是 98 页和 424,638 个字符(包括空格)。

当我查看返回到视图的 html 时,专门检查了结果值,我可以看到字符数下降到 31,424。因为它被截断,JSON所以无效,我收到错误“未捕获的语法错误:意外字符串”

如果我限制返回的记录,那么一切都会再次起作用。但是,我不能那样做。我需要所有值作为选项。

处理这个问题的最佳方法是什么?我可以确保将完整的JSON字符串返回到视图中吗?还有另一种方法可以为自动完成创建对象吗?或者,我是否需要人为限制 的长度,JSON然后在视图中组合结果?

对此的任何帮助表示赞赏。到目前为止,谷歌搜索一直没有帮助。

更新

我只是仔细看了一下,现在看到完整的字符串正在传递给视图。AJAX 调用中返回的数据具有完整的字符串。但是,当它执行jQuery.parseJSON时,它会被截断。

更新 2

删除"其中一个值字符串中的找到后,一切都按预期工作。显然字符串没有被截断,只是data开发人员工具中可见的参数没有显示完整的字符串。

4

2 回答 2

1

您不能一次显示数千条记录。没有理由退回数千人。只需让自动完成功能自行调用 ajax,如jQuery UI 网站所示。

确保您的服务器端 ajax 端点将结果集过滤到合理的范围内……比如 20-25 条记录。

一些提示:您的 MVC 控制器方法将希望返回 JsonResult 而不是 View。此外,请务必将 JsonResult 设置为允许 HttpGet(作为 JsonResult 对象的属性):

像这样的东西(VB,但你可以弄清楚):

$('#txtSearchTerms').autocomplete({
    source: function (request, response) {
        $.ajax({
            url: '@Context.Request.Url.Scheme://@Context.Request.Url.Host:@Context.Request.Url.Port/Ajax/ProductSearch/' + $('#txtSearchTerms').val(),
            dataType: 'json',
            data: {},
            success: function (data) {
                response($.map(data, function (item) {
                    return {
                        label: iitem.Name,
                        value: item.ProductID,
                        id: item.ProductID
                    }
                }))     //  response
            }           //  success
        })              //  ajax
    }                   //  source function
});

<HttpGet>
Public Function ProductSearch(term As String) As JsonResult
  Dim payload As SomeModel = Nothing
  Using database As WebDataContext = New WebDataContext
    database.Configuration.CreateProxies = False
    payload = (From p In database.Products Where p.Name.Trim.ToLower.StartsWith(term.Trim.ToLower) Select p).Take(25).ToList
  End Using

  Return New JsonResult With {.Data = payload, .JsonRequestBehavior = JsonRequestBehavior.AllowGet}
End Function
于 2013-11-07T00:06:59.907 回答
1

你是否应该有一个这么长的字符串是一个很好的问题(你应该回答一个),但是一个单独的主题。

根据我的经验,如果您收到“未捕获的语法错误:意外字符串”错误,则字符串中有一些未转义的字符导致它失败(例如 '";:)。

鉴于较短的字符串有效,它可能是带有无效字符的完整结果末尾的记录之一。

您看到的截断可能仅仅是您在浏览器中访问字符串的结果,而不是对 JSON 字符串大小的限制。鉴于您上次更新完整字符串在那里,我推测发送到解析器的字符串没有被截断。

我建议您仔细查看完整的字符串并检查值中的未转义字符。

于 2013-11-07T12:41:08.877 回答