MVC:如何以JSON形式返回字符串
为了使进度报告过程更加可靠,并将其与请求/响应分离,我正在执行Windows服务中的处理,并将预期的响应保存到文件中。 当客户端开始轮询更新时,意图是控制器将文件的内容(无论它们是什么)作为JSON字符串返回。
该文件的内容已预先序列化为JSON。 这是为了确保答复中没有任何东西存在。 不需要处理(仅将文件内容读入字符串并返回)来获取响应。
我最初虽然这会很简单,但事实并非如此。
目前我的控制器方法看起来如此:
调节器
更新
[HttpPost]
public JsonResult UpdateBatchSearchMembers()
{
string path = Properties.Settings.Default.ResponsePath;
string returntext;
if (!System.IO.File.Exists(path))
returntext = Properties.Settings.Default.EmptyBatchSearchUpdate;
else
returntext = System.IO.File.ReadAllText(path);
return this.Json(returntext);
}
而Fiddler正在将此作为原始回应
HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Mon, 19 Mar 2012 20:30:05 GMT
X-AspNet-Version: 4.0.30319
X-AspNetMvc-Version: 3.0
Cache-Control: private
Content-Type: application/json; charset=utf-8
Content-Length: 81
Connection: Close
"{"StopPolling":false,"BatchSearchProgressReports":[],"MemberStatuses":[]}"
AJAX
更新
以后可能会改变,但现在这是工作时,我正在生成响应类,并像普通人一样返回为JSON。
this.CheckForUpdate = function () {
var parent = this;
if (this.BatchSearchId != null && WorkflowState.SelectedSearchList != "") {
showAjaxLoader = false;
if (progressPending != true) {
progressPending = true;
$.ajax({
url: WorkflowState.UpdateBatchLink + "?SearchListID=" + WorkflowState.SelectedSearchList,
type: 'POST',
contentType: 'application/json; charset=utf-8',
cache: false,
success: function (data) {
for (var i = 0; i < data.MemberStatuses.length; i++) {
var response = data.MemberStatuses[i];
parent.UpdateCellStatus(response);
}
if (data.StopPolling = true) {
parent.StopPullingForUpdates();
}
showAjaxLoader = true;
}
});
progressPending = false;
}
}
我相信这个问题是Json操作结果是为了获取一个对象(您的模型)并创建一个HTTP响应,其内容是来自模型对象的JSON格式的数据。
但是,您传递给控制器的Json方法的是JSON格式的字符串对象,因此它将字符串对象“序列化”为JSON,这就是为什么HTTP响应的内容被双引号(I'假设这是问题)。
我认为您可以考虑使用Content操作结果作为Json操作结果的替代方法,因为您基本上已经拥有可用HTTP响应的原始内容。
return this.Content(returntext, "application/json");
// not sure off-hand if you should also specify "charset=utf-8" here,
// or if that is done automatically
另一种选择是将服务中的JSON结果反序列化为一个对象,然后将该对象传递给控制器的Json方法,但缺点是您需要反序列化然后重新序列化数据,这可能是不必要的为你的目的。
您只需要返回标准ContentResult并将ContentType设置为“application / json”。 你可以为它创建自定义的ActionResult:
public class JsonStringResult : ContentResult
{
public JsonStringResult(string json)
{
Content = json;
ContentType = "application/json";
}
}
然后返回它的实例:
[HttpPost]
public JsonResult UpdateBatchSearchMembers()
{
string returntext;
if (!System.IO.File.Exists(path))
returntext = Properties.Settings.Default.EmptyBatchSearchUpdate;
else
returntext = Properties.Settings.Default.ResponsePath;
return new JsonStringResult(returntext);
}
是的,这是没有进一步的问题,避免原始字符串JSON就是这样。
public ActionResult GetJson()
{
var json = System.IO.File.ReadAllText(
Server.MapPath(@"~/App_Data/content.json"));
return new ContentResult
{
Content = json,
ContentType = "application/json",
ContentEncoding = Encoding.UTF8
};
}
注意:请注意, JsonResult
方法返回类型JsonResult
用于我,因为JsonResult
和ContentResult
都继承了ActionResult
但它们之间没有关系。