为 JsonResult 调用 @Html.Action 会更改我在父模板中的响应类型
Posted
技术标签:
【中文标题】为 JsonResult 调用 @Html.Action 会更改我在父模板中的响应类型【英文标题】:calling @Html.Action for JsonResult changes my response type in parent template 【发布时间】:2012-05-19 14:42:48 【问题描述】:我有以下控制器:
public class HelloController
public ActionResult Index()
return View()
public ActionResult Hello()
return Json(new greeting = "hello, world!" , JsonRequestBehavior.AllowGet);
那么,在Index.cshtml
里面:
...html stuffs
<script type="text/javascript">
alert("@Html.Action("Hello")");
</script>
我发现,当在我的浏览器中访问此 url 时,响应内容类型为 application/json; charset=utf-8
,这会导致浏览器将 html 呈现为字符串而不是...网页。
解决这个问题的最佳方法是什么?
【问题讨论】:
【参考方案1】:原因是所有Html.Action
调用都是直接执行的。比如:
-
索引被调用
查看结果被执行
Hello 动作被执行,set 的 ContextType
返回索引视图结果
浏览器显示页面
你有两个选择:
-
打破生成“Hello world!”的逻辑进入常规 C# 类并直接在 Index 控制器操作中调用它
通过ajax加载Hello动作,然后显示
alert
。
选项 1
public class HelloController
YourBusiness _yb;
public HelloController(YourBusiness yb)
_yb = yb;
public ActionResult Index()
return View(yb.GenerateHello())
// used for everything but Index
public ActionResult Hello()
return Json(new greeting = yb.GenerateHello() , JsonRequestBehavior.AllowGet);
public class YourBusiness
public string GenerateHello()
return "Hello wolrd!";
选项 2
<script type="text/javascript">
$.get('@Url.Action("Hello")', function(response)
alert(response.greeting);
</script>
旁注
Internet Explorer 在缓存方面非常激进。 JSON 响应将被更改。因此,我建议您也不要为 JSON 操作指定缓存:
[OutputCache(Duration = 0, NoStore = true)]
public ActionResult Hello()
return Json(new greeting = "hello, world!" , JsonRequestBehavior.AllowGet);
【讨论】:
我目前正在使用选项 2,但认为我会将其切换为更像您的第一个选项以减少我的 http 请求数量。谢谢!【参考方案2】:只需使用Json(...)
的重载来设置正确的内容类型。
public class HelloController
public ActionResult Index()
return View()
public ActionResult Hello()
return Json(new greeting = "hello, world!" , "text/html", JsonRequestBehavior.AllowGet);
【讨论】:
我宁愿将内容类型保留为 application/json 以便 url 可用于此特定用例以外的目的【参考方案3】:如果你通过调用 Json() 方法返回一个 JsonResult,它不会返回一个网页。要返回一个页面,您需要通过调用 View 方法返回一个 ViewResult。你的方法应该有一个对应的视图模板
查看this 链接或this 一个
【讨论】:
以上是关于为 JsonResult 调用 @Html.Action 会更改我在父模板中的响应类型的主要内容,如果未能解决你的问题,请参考以下文章
简单的 JsonResult 在 Jquery ajax 方法上返回 parsererror
无法将类型“System.Web.Mvc.RedirectToRouteResult”隐式转换为“System.Web.Mvc.JsonResult”