【问题标题】:View rendering as plain text when action called from partial view当从局部视图调用操作时,将呈现为纯文本
【发布时间】:2015-01-10 05:07:23
【问题描述】:

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

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

动作被调用,美妙的Json替换了输出中的@Html.Action,但是整个视图(_Layout、View和partial)以纯文本的形式呈现到页面上。如果我只用括号替换 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 上,页面也可以正常渲染。

【问题讨论】:

  • 你的剧本是不是部分的?
  • 是的,javascript 在部分中。
  • 我不知道这是否是您的问题的原因,但强烈建议不要将脚本放在您的部分中。它被插入到页面的中间,并可能对脚本造成非常奇怪的影响
  • 是的,我对这些问题很熟悉。我正在研究一种有点……非正统的设计策略。但就像我在帖子中所说的那样,javascript 在所有情况下都可以正常工作,除非我调用控制器操作(包括当我复制/粘贴控制器操作结果代替控制器操作时)。
  • 那么你想以某种方式调用@Html.Action 并将结果分配给cols 吗?

标签: asp.net-mvc json asp.net-mvc-4 partial-views


【解决方案1】:

这是因为当您调用返回 JsonResult 的操作时,它会将响应内容类型设置为 application/json。

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

如果您不想更改控制器,则可以对视图进行更改

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

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

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

【讨论】:

  • MVC 团队的另一个绝妙设计决策。意味着返回 JsonResult 的函数只能使用 ajax 干净地调用。
猜你喜欢
  • 2014-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-18
相关资源
最近更新 更多