Asp.Net MVC2 RenderAction改变页面mime类型?

Gab*_*art 13 asp.net-mvc renderaction mime-types asp.net-mvc-2

Html.RenderAction如果子操作的类型与父操作的类型不同,调用Asp.Net MVC2应用程序似乎可以改变页面的mime类型.

下面的代码(在MVC2 RTM中测试),对我来说似乎很合理,application/json在调用时会返回类型的结果Home/Index.浏览器不会显示页面,而是会barf并询问您是否要下载它.

我的问题:我错过了什么吗?这是一个错误吗?如果是这样,最好的解决方法是什么?

控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewData[ "Message" ] = "Welcome to ASP.NET MVC!";

        return View();
    }

    [ChildActionOnly]
    public JsonResult States()
    {
        string[] states = new[] { "AK", "AL", "AR", "AZ", };

        return Json(states, JsonRequestBehavior.AllowGet);
    }
}
Run Code Online (Sandbox Code Playgroud)

视图:

<h2><%= Html.Encode(ViewData["Message"]) %></h2>
<p>
    To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>.
</p>
<script>
  var states = <% Html.RenderAction("States"); %>;
</script>
Run Code Online (Sandbox Code Playgroud)

Cra*_*ntz 8

这不是一个错误.该JsonResult类型应该将结果设置为JSON,因为这通常是您想要的.

你真的不想要JSON 结果,你想要一个JSON 字符串.那么为什么不写那个呢?

[NonAction]
public string States()
{
    string[] states = new[] { "AK", "AL", "AR", "AZ", };

    return new JavaScriptSerializer().Serialize(states);
}
Run Code Online (Sandbox Code Playgroud)

  • 这将工作...它似乎不像一个子动作应该能够改变整个页面的ContentType. (5认同)

小智 8

我认为这是一个错误.如果这是一个正在渲染的动作,为什么它会改变动作响应?Html.Action也是如此,它将它呈现为一个字符串.我的解决方法是:

Html.ViewContext.HttpContext.Response.ContentType = "text/html";
Run Code Online (Sandbox Code Playgroud)

在调用Html.Action之后.我想有人可以写一个包装器Html Helper扩展,类似于:

var aux = Html.ViewContext.HttpContext.Response.ContentType;
Html.Action(....); // or Html.RenderAction(...)
Html.ViewContext.HttpContext.Response.ContentType = aux;
Run Code Online (Sandbox Code Playgroud)