【问题标题】:Unified MVC and Web Api - same controller for views and json?统一 MVC 和 Web Api - 视图和 json 的相同控制器?
【发布时间】:2014-11-18 12:35:20
【问题描述】:

Visual Studio 2015(预览版)中的一项新功能是“ASP.NET MVC 和 Web API...已统一为一个单一的编程模型。”

http://blogs.msdn.com/b/webdev/archive/2014/11/12/announcing-asp-net-features-in-visual-studio-2015-preview-and-vs2013-update-4.aspx

我假设这意味着我可以编写单个控制器操作“GetCustomerById”,它返回一个 Customer 对象,并且可以根据内容协商将其呈现为序列化 Json 或 Html(使用 mvc 视图)。 (如果用户使用“Accept: application/json”或“Accept: text/html”请求它)

但我看不出这是怎么做到的,它们似乎仍然需要不同的控制器和方法?

【问题讨论】:

  • 据我了解,他们只是将两个库合并为一个:asp.net/vnext/overview/aspnet-vnext/aspnet-5-overview#unify
  • 是的,他们实际上写道“您不再需要根据您是在 MVC、Web API 还是网页上下文中编写稍微不同的代码”,所以我假设有是一种编写单个动作的方法(对于 json 和 html 响应)?否则我需要复制代码
  • 是的,但他们没有在样本中的任何地方显示它,这让我认为这样的功能不会存在
  • 通过查看示例 (asp.net/vnext/overview/aspnet-vnext/create-a-web-api-with-mvc-6),它看起来将是基于属性的路由。因此,如果您在同一个控制器中拥有 MVC 和 WebApi,则必须将属性路由应用于每个操作方法,而不是在控制器级别。

标签: asp.net-mvc asp.net-web-api visual-studio-2015


【解决方案1】:

这可以在没有新的统一模型的情况下完成。在任何 MVC 控制器中,您都可以检查标头以及 Request.IsAjaxRequest() 方法以确定是否返回数据。

这是这种方法的简单简化示例:

internal ActionResult ReturnResultAsRequested(object result)
{
  if (Request.Headers["Accept"].Contains("application/json"))
    return Json(result);
  else if (Request.IsAjaxRequest())
    return PartialView(Request.RequestContext.RouteData.Values["Action"], result);
  else
    return View(Request.RequestContext.RouteData.Values["Action"], result);
}

【讨论】:

  • 嗯。在 ASP.NET vNext 中,您没有 IsAjaxRequest 和 RequestContext。您也不能在控制器上方定义路由,而是将该控制器用作常规 MVC 控制器。
猜你喜欢
  • 1970-01-01
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-08
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
  • 2013-04-22
相关资源
最近更新 更多