2014-11-18 3 views
6

Eines der neuen Features in Visual Studio 2015 (Vorschau) ist, dass "ASP.NET MVC und Web API ... zu einem einzigen Programmiermodell vereinheitlicht wurden."Unified MVC und Web API - gleiche Controller für Ansichten und JSON?

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

ich, dass dies angenommen bedeutete, dass ich eine einzelne Controller-Aktion „GetCustomerById“ schreiben könnte, dass ein Kunden Objekt zurückgegeben und dass es entweder als serialisierte Json oder als HTML (unter Verwendung einer mvc Ansicht) gemacht werden könnte basierend auf Inhaltsverhandlung. (wenn der Benutzer es mit "Akzeptieren: application/json" oder "Accept: text/html" anfordert)

Aber ich kann nicht sehen, wie das gemacht werden kann, sie scheinen immer noch andere Controller und Methoden zu benötigen?

+0

Wie ich verstanden sie zwei Bibliotheken in eine gerade verschmolzen: http://www.asp.net/vnext/overview/aspnet-vnext/aspnet-5-overview # unify –

+0

Ja, und sie schreiben tatsächlich: "Sie müssen nicht mehr leicht unterschiedlichen Code schreiben, je nachdem, ob Sie sich in einem MVC-, Web-API- oder Webseitenkontext befinden", nehme ich an Es gibt eine Möglichkeit, eine einzige Aktion zu schreiben (sowohl für die JSON- als auch für die HTML-Antwort). Sonst muss ich den Code duplizieren – Bjorn

+0

Ja, aber sie zeigen es nirgendwo in ihren Proben, was mich denken lässt, dass solche Funktionalität nicht da sein wird –

Antwort

0

Dies kann ohne das neue einheitliche Modell erfolgen. In jedem MVC-Controller können Sie die Header sowie die Request.IsAjaxRequest()-Methode überprüfen, um festzustellen, wie Daten zurückgegeben werden.

Hier ist nackten Knochen vereinfachtes Beispiel eines solchen Verfahrens:

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); 
} 
+0

Hm. In ASP.NET vNext verfügen Sie nicht über IsAjaxRequest und RequestContext. Sie können die Route nicht über den Controller definieren und diesen Controller als normalen MVC-Controller verwenden. –