返回带有模型的 MVC 视图时,是否可以添加 json 响应?



有没有办法添加一个JSON结果,该结果将被AJAX的OnSuccess或OnFailure选项使用。当控制器使用返回视图(模型)语法时开始窗体?

一切都非常标准的C#/MVC。Ajax.BeginForm 看起来像这样

@using (Ajax.BeginForm("AnyAction", "Home", null,
new AjaxOptions
{
HttpMethod = "Post",
OnBegin = "OnBegin",
OnFailure = "OnFailure(xhr, status)",
OnSuccess = "OnSuccess(xhr, status)"
},
new { id = "myform" }))

OnSuccess 和 OnFailure 脚本定义如下

function OnSuccess(xhr, status) {
console.log("OnSuccess");
}
function OnFailure(xhr, status) {
console.log("OnFailure");       
}

控制器像这样返回

HttpContext.Response.StatusCode = (int)HttpStatusCode.NotAcceptable;
return View(model);

我可以将HTTPStatusCode(OK或Not OK)注入HTTPContext.Response,这将触发OnSuccess或OnFailure javascript函数。由此我知道我可以操作响应流,但无论如何都可以将JSON响应添加到HTTPContext.Response,以便OnSuccess或OnFailure可以使用它。

如何在使用返回视图(模型)语法时将其传递给 OnSuccess 函数?

dynamic jsonMessage;
jsonMessage = new { param1 = "ModelState", param2 ="Error", param3 = "Error Message" };

一些快速说明:

这不是一个要求,只是一个问题。

我已经在我的项目的其他地方使用了返回JSON(jsonMessage,JsonRequestBehavior.AllowGet),不需要帮助。

由于您的 JSON 很小,您可以使用

HttpContext.Response.AddHeader("json", "json_string");.

然后,可以从 OnSuccess/Failure 方法中的标头值访问它。

我想跟进我的最终解决方案。首先,我们需要调整 Ajax.BeginForm 属性的 OnSuccess 定义,使其如下所示。我尝试了几种变体,但这个确切的代码是唯一有效的代码。

@using (Ajax.BeginForm("AddUserRole", "AppRoles", null,
new AjaxOptions
{
HttpMethod = "Post",
OnBegin = "OnBegin",
OnFailure = "OnFailure(xhr, status)",
OnSuccess = "OnSuccess(data, status, xhr)"
},
new { id = "myform" }))

接下来,OnSuccess 的 JavaScript 如下所示。需要注意的几件事;首先,控制器(显示在更下方)可以返回 JsonResult 或视图/模型。只要 HttpResponseStatus 正常,无论返回哪个函数,都将触发 OnSuccess 函数。如果控制器返回视图/模型,则数据参数将包含整个渲染视图,我想要的 json 将位于 XHR 参数中。要使用 json 响应,必须使用 getResponseHead 提取它,然后将其序列化为 JSON。之后,我们可以将其作为常规的旧 JSON 对象使用。

function OnSuccess(data, status, xhr) {
console.log("OnSuccess");
// this is for capturing from the Response header WHEN the controller returns a view
var srchMessage = xhr.getResponseHeader("srchMessage")
if (srchMessage != null) {
var srchJson = JSON.parse(srchMessage);
console.log("srchMessage:param1" + srchJson.param1);
return;
}
// this is for capturing the json WHEN the controller returns a JsonResult
if (xhr.responseJSON != null) {
console.log("xhr.responseJSON.param1" + xhr.responseJSON.param1);
}
}

MVC 控制器可以返回"短"JsonResult 或完整视图,看起来有点像这样

public ActionResult AjaxTest(AppModel model)
{
if (model.status == "ReturnView")
{
jsonMessage = new { param1 = "param1", param2 = "param2", param3 = "param3" };
string jsonString = Newtonsoft.Json.JsonConvert.SerializeObject(jsonMessage);
HttpContext.Response.AddHeader("srchMessage", jsonString);
HttpContext.Response.StatusCode = (int)HttpStatusCode.OK;
return View(model);
}
if (model.status == "ReturnJSON")
{
jsonMessage = new { param1 = "param1", param2 = "param2", param3 = "param3" };
HttpContext.Response.StatusCode = (int)HttpStatusCode.OK;
return Json(jsonMessage, JsonRequestBehavior.AllowGet);
}
}

我不确定为什么要这样做,我应该为不同的操作使用单独的控制器,但如果你想这样做,这就是可以做到的。

相关内容

  • 没有找到相关文章

最新更新