让我的 Index() 方法根据传入的接受/内容类型标头返回内容的正确方法是什么。
我目前有一个我正在尝试重构的应用程序,它有一个 Index() 方法和一个 JsonData() 方法。浏览器拉出这个“索引”页面,然后通过 Ajax 请求 /jsondata URL。我想将两者都放在 Index() 下,并根据传入的请求更改响应类型。在 MVC 4 下执行此操作的正确方法是什么?
注意:我们没有使用 Web API。
让我的 Index() 方法根据传入的接受/内容类型标头返回内容的正确方法是什么。
我目前有一个我正在尝试重构的应用程序,它有一个 Index() 方法和一个 JsonData() 方法。浏览器拉出这个“索引”页面,然后通过 Ajax 请求 /jsondata URL。我想将两者都放在 Index() 下,并根据传入的请求更改响应类型。在 MVC 4 下执行此操作的正确方法是什么?
注意:我们没有使用 Web API。
您在这里有几个选择。
首先 - 通过动词区分您的请求,并有一个约定,例如所有GET
s 接收 html,而所有POST
s 接收 json。控制器将如下所示:
[HttpGet]
[ActionName("Index")]
public ActionResult IndexGet()
{
return View();
}
[HttpPost]
[ActionName("Index")]
public ActionResult IndexPost()
{
return Json();
}
当然,使用正确的方法发出请求是客户端的问题。更新- 仅动词在这里是不够的 - 要保留一个动作名称,您还应该使用ActionName
属性。感谢Joe Enos指出这一点。
第二 - 引入一个参数。假设默认情况下您正在发送 html,但如果 ajax 调用附加了一个参数isJson
- 给它 json 响应:
public ActionResult Index(bool? isJson)
{
if (isJson.HasValue && isJson.Value)
{
return Json();
}
return View();
}
第三 - 通过它们背后的机制区分请求。在您的情况下,似乎所有 ajax 调用,并且只有它们,都应该由 json 提供。然后你可以使用Request.IsAjaxRequest()
方法:
public ActionResult Index()
{
if (Request.IsAjaxRequest())
{
return Json();
}
return View();
}
当然,也可以组合这些方法——比如仅通过 ajax 向 POST 请求发送 json 响应。
可以尝试通过请求 AcceptTypes 解决此问题吗?
public ActionResult Index()
{
if (Request.AcceptTypes.Contains("application/json"))
{
//
}
else
{
}
return View();
}