表单 POST 无法使用巨大的 json 字符串;还有其他方法可以加载包含大量 POST 数据的页面吗?

Posted

技术标签:

【中文标题】表单 POST 无法使用巨大的 json 字符串;还有其他方法可以加载包含大量 POST 数据的页面吗?【英文标题】:form POST not working with huge json string; is there any other way to load a page with a huge amount of POST data? 【发布时间】:2015-06-12 10:12:38 【问题描述】:

我正在尝试使用表单来加载包含发布数据的页面。帖子数据是一个巨大的字符串,我不确定长度是否导致问题。

我有一个指向结果页面的搜索页面,结果页面在显示结果之前需要一段时间才能加载。我的客户不希望用户在结果加载完成之前被引导离开搜索页面,因为他们不喜欢结果页面上冗长的“加载”微调器。该站点的原始结构是,当单击搜索按钮时,它会生成一个查询字符串并使用 window.location 指向此操作结果,该操作结果返回一个 View:

public ActionResult Results(String q, String keywords, int? fromyear, int? toyear, int? newsearch, 
        String recordtype, String location, int? volumeId, string volumeName, string pageName, IEnumerable<Attribute> attributes,
        bool favorites = false, bool free = false, bool images = false,
        String firstname = "", String lastname = "", bool soundex = false, bool exact = false, String category = "", 
        String database = "", String fam1first = "", String fam1last = "", String fam1type = "", String fam2first = "", 
        String fam2last = "", String fam2type = "", String fam3first = "", String fam3last = "", String fam3type = "", 
        int size = 50, int page = 1, String sortby = "Relevance", bool accessible = false, bool exactlocation = false, bool loadFirst = false)
    
    .......
    return View("index", viewModel);
    

我想我可以通过将动作分成两部分来完成这个请求:我可以使用结果将视图模型返回为 json,然后创建一个新的动作结果,它接受一个 json 字符串,将其反序列化到视图模型中,并在页面上显示视图模型:

public ActionResult LoadedResults(String jsonString = "")

    var vm = JsonConvert.DeserializeObject<SearchResultsViewModel>(jsonString);
    return View("index", vm);

现在,在我的搜索页面上,我不是直接导航到新的 URL,而是这样做:

var searchUrl = window.location.protocol + "//" + window.location.host + "/SearchResults/Results?" + querystring;
$.ajax(
    url: searchUrl,
    type: 'GET',
    dataType: 'json',
    success: function (info) 
        console.log(info);
        var results = JSON.stringify(info);
        $("#jsonString").val(results);
        $("#submitResults").click();
    ,
    error: function (info) 
        alert("error");
    

使用这种形式:

<form id="resultsForm" method="POST" action="http://nehgs.mvc/SearchResults/LoadedResults">
    <input type="text" name="jsonString" id="jsonString"/>
    <br/>
    <input type="submit" value="Submit" id="submitResults"/>
</form>

但是,提交 viewmodel 字符串会导致一个错误页面,其中没有关于导致错误的原因的信息。我在 LoadedResults actionresult 的第一行设置了一个断点。当我单击文本框中没有任何内容的提交按钮时,我点击了断点。当我输入一个虚拟字符串(如“hello!”)或空 json(如“”)时,我也会遇到断点。但是,当我输入我的实际视图模型字符串时,断点没有被命中,我只是立即得到一个错误页面。

这是因为我的视图模型字符串太大了吗?我正在测试的字符串是 63088 个字符,它因搜索而异。如果这是它不起作用的原因,有什么方法可以完成我的客户的要求吗?

【问题讨论】:

您在浏览器设置字符长度限制的ajax中使用GET,请尝试使用POST GET 用于生成放入#jsonString 的json 字符串。那部分有效。放入视图模型数据后,单击提交按钮不起作用。 说实话流程看起来很奇怪。为什么你需要从服务器发送巨大的 json 只是为了把它放在一个表单中提交它?为什么不能将数据存储在服务器的会话或类似的东西中 如果您对如何完成此操作有更好的想法,请说出来。客户的要求对我来说很不寻常,我正在尝试找出最好的方法。 会看看为什么结果页面需要很长时间,看看它是否可能是延迟加载或分页或什么的。更高级别的问题不是很清楚 【参考方案1】:

在你的代码中使用

$('#resultsForm').submit(function(event)
  event.preventDefault();
  $.ajax(
  type:"post",
  data:$(this).serialize(),
  success:function(response)
       //Your Code.
     
  );
);

这将使用 Post 方法发送表单数据,您可以在新页面中加载结果。

【讨论】:

以上是关于表单 POST 无法使用巨大的 json 字符串;还有其他方法可以加载包含大量 POST 数据的页面吗?的主要内容,如果未能解决你的问题,请参考以下文章

当我们向服务器post数据时,表单 or JSON

使用 JSON 格式的 POST 方法 web api 将动态输入提交到数据库

Vue表单form数据转化为Json字符串

无法通过 @POST 请求使用 Retrofit 解析 JSON 响应和参数

如何使用 Django 从 POST 表单中获取 JSON 响应

如何使用带有表单数据主体而不是 json 主体的 http 'POST'? (Angular2/打字稿)