为 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 之后不调用 Ajax 成功

简单的 JsonResult 在 Jquery ajax 方法上返回 parsererror

[.NET MVC] JsonResult的最大长度

无法将类型“System.Web.Mvc.RedirectToRouteResult”隐式转换为“System.Web.Mvc.JsonResult”

ObjectResult 和 JsonResult 有啥区别

如何在 MVC4 中将 Json 字符串输出为 JsonResult?