3

让我的 Index() 方法根据传入的接受/内容类型标头返回内容的正确方法是什么。

我目前有一个我正在尝试重构的应用程序,它有一个 Index() 方法和一个 JsonData() 方法。浏览器拉出这个“索引”页面,然后通过 Ajax 请求 /jsondata URL。我想将两者都放在 Index() 下,并根据传入的请求更改响应类型。在 MVC 4 下执行此操作的正确方法是什么?

注意:我们没有使用 Web API。

4

2 回答 2

3

您在这里有几个选择。

首先 - 通过动词区分您的请求,并有一个约定,例如所有GETs 接收 html,而所有POSTs 接收 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 响应。

于 2013-06-19T15:00:07.590 回答
1

可以尝试通过请求 AcceptTypes 解决此问题吗?

 public ActionResult Index()
        {
            if (Request.AcceptTypes.Contains("application/json"))
            {
                //
            }
            else 
            {

            }
            return View();
        }
于 2013-06-19T15:02:24.720 回答