表单 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 数据的页面吗?的主要内容,如果未能解决你的问题,请参考以下文章
使用 JSON 格式的 POST 方法 web api 将动态输入提交到数据库
无法通过 @POST 请求使用 Retrofit 解析 JSON 响应和参数