当从局部视图调用操作时,以纯文本形式查看渲染

View rendering as plain text when action called from partial view

我正在尝试从局部视图中调用控制器操作(Json结果):

var departmentsViewJS = {
    view: "accordion",
    multi: true,
    cols: @Html.Action("GetDepartmentsJson")
};

动作被调用,精彩的 Json 替换了输出中的 @Html.Action,但是整个视图(_Layout、View 和部分)以纯文本形式呈现到页面。如果我用这样的方括号替换 Action:

var departmentsViewJS = {
    view: "accordion",
    multi: true,
    cols: []
};

页面呈现得非常好(但没有那些列)。是不是我们不允许在局部中做这样的事情,还是我搞砸了什么地方?

这是渲染输出的示例:

var departmentsViewJS = {
    view: "accordion",
    multi: true,
    cols: [{"Id":25,"DocRoot":"Test","Name":"Test","DepartmentKeywords":null},{"Id":27,"DocRoot":"HumanResources","Name":"Human Resources","DepartmentKeywords":null}]
};

如果我将渲染的 Json 复制到 @Html.Action 上,页面也可以正常渲染。

发生这种情况是因为当您调用 return JsonResult 操作时,它会将响应内容类型设置为 application/json。

您可以在服务器端将 GetDepartmentsJson 的 return 类型更改为字符串并将对象序列化为 json。

如果您不想更改您的控制器,那么您可以更改您的视图

@{ var prevContentType = Html.ViewContext.HttpContext.Response.ContentType; }

var departmentsViewJS = {
   view: "accordion",
   multi: true,
   cols: @Html.Action("GetDepartmentsJson"); }
};

@{ Html.ViewContext.HttpContext.Response.ContentType = prevContentType; }