2016-03-22 23 views
-1

Ich weiß, dass dies wie eine dämliche Frage klingt, aber gibt es eine Möglichkeit, WebAPI-Routing-Stil (d. H. Möglicherweise die [HttpPost] Dekoration etc) für einen MVC-Controller zu "imitieren". Der Kern meines Problems ist, dass ich eine 'Container'-MVC-Site habe. Diese in PreLoad enthaltenen Dateien laden andere MVC-Sites innerhalb des Bereichsordners hoch und integrieren sie in sich. Es fungiert also grundsätzlich als Plugin-System. Das alles funktioniert gut, aber ich muss hinzufügen, in einer API für diese Website, die ich dachte, wäre viel einfacher, nur wenn ich die API als ein anderes Plugin gemacht.MVC-Routing (wie WebAPI)

Ich benutze Ninject in meiner Website, die wieder funktioniert, die Abhängigkeiten von den Plugins alle perfekt zu bekommen. Das Problem ist, dass Ninject automatisch die MVC-Controller, aber nicht die WebAPI-Controller erkennt, und ich habe herausgefunden, dass Sie nicht ein Projekt haben können, das sowohl WebAPI als auch MVC mit Nijnect ausführt. Meine nächste Option besteht darin, WebAPI innerhalb von MVC nachzuahmen (schließlich basieren sie auf dem gleichen Prinzip).

Zuerst dachte ich, das wäre wirklich einfach, default der Aktionsname auf "Index" im Routing und sie haben einfach die "AcceptVerbs" -Dekoration auf jede Methode gesetzt. Natürlich hat es nicht funktioniert.

Weiß jemand, wie ich gehen würde oder eine Alternative zum Erstellen etwas wie ein RestAPI nur mit der MVC-Seite (nicht Wechsel zu WebAPI)?

Antwort

0

In Ihrem RouteConfig.cs-Datei können Sie festlegen, welche HTTP-Verb Aktion durch einen HttpMethodContraint zu dem geht vorbei:

routes.MapRoute(
"route that matches only GETs for your url", 
"your url", 
new { controller = "some controller", action = "some action" }, 
new { httpMethod = new HttpMethodConstraint("GET") }); 

Dies ermöglicht es Ihnen, Definieren Sie Routen zu Ihrem Controller, die WebAPI nachahmen.

0

Sie können Controller wie üblich verwenden und sie die JsonResult zurückgeben. Ich verwende diesen Ansatz für einige meiner Ansichten, die dynamische Listen durch Nachschlagen benötigen, aber nicht zur Web-API gehen müssen. Zusammen mit dem Attribut-Routing konnte ich web-api-ähnliche Funktionalität von meinem MVC bekommen. Beispiel-Szenario ist Ich habe ein Formular, das einige Felder basierend auf einem Wert füllt, der aus einem Kombinationsfeld ausgewählt wird. Wenn ein Benutzer eine Option auswählt, verwende ich JQuery, um die WebAPI-ähnliche Aktion in meinem Controller aufzurufen.

[RoutePrefix("Pickup")] 
[Route("{action=Create}")] 
public class PickupController : FrontOfficeAuthorizedController { 

    [HttpPost] 
    public JsonResult GetSenderAddress(Guid? addressId) { 
     if(addreddId != null) { 
      //Do something to get an address 

      if(address != null) { 
       //Only send required info over the wire 
       return Json(new { 
         success = true, 
         address = new { 
          Address1 = address.Address1, 
          Address2 = address.Address2, 
          AddressType = address.AddressType, 
          CompanyOrName = address.CompanyOrName, 
          Contact = address.Contact, 
          Country = address.Country, 
          PostalCode = address.PostalCode, 
          Telephone = address.Telephone, 
          TownCity = address.TownCity, 
         } 
       }); 
      } 
     } 
     return Json(new { success = false }); 
    } 

} 

Hier ist ein Schnipsel des Javascript auf der Client-Seite. Hinweis Ich verwende Knockout zusammen mit JQuery

//Shipfrom properties 
self.ShipFromaddressid = ko.observable(); 
//Update shipfrom address based on id 
self.ShipFromaddressid.subscribe(function() { getAddress(); }); 


var getAddress = function() { 
    var selectedAddressId = { addressId: self.ShipFromaddressid() }; 
    $.ajax({ 
     url: '@(Url.Action<PickupController>(c=>c.GetSenderAddress(null)))', 
     type: 'Post', 
     contentType: 'application/json', 
     dataType: 'json', 
     data: JSON.stringify(selectedAddressId), 
     success: handleResponse 
    }); 
}; 

var handleResponse = function (data) { 
    if (data.success) { 
     //console.log(data.address); 
     self.ShipFromCompanyOrName((data.address.CompanyOrName) ? data.address.CompanyOrName : ""); 
     self.ShipFromContact((data.address.Contact) ? data.address.Contact : ""); 
     self.ShipFromTelephone((data.address.Telephone) ? data.address.Telephone : ""); 
     self.ShipFromAddress1((data.address.Address1) ? data.address.Address1 : ""); 
     self.ShipFromAddress2((data.address.Address2) ? data.address.Address2 : ""); 
     self.shipfromtowncity((data.address.TownCity) ? data.address.TownCity : ""); 
     self.ShipFromPostalCode((data.address.PostalCode) ? data.address.PostalCode : ""); 
     self.ShipFromCountry((data.address.Country) ? data.address.Country : ""); 
     self.ShipFromAddressType((data.address.AddressType) ? data.address.AddressType : ""); 
    } 
};