2016-03-22 22 views
-1

Bunun bir küspe soru gibi geldiğini biliyorum, ancak bir MVC Denetleyici için WebAPI yönlendirme stilini (yani [HttpPost] dekorasyonunu vb. Kullanarak) taklit etmenin bir yolu var. Sorunumun özü bir 'konteyner' MVC sitem var. Bu, PreLoad içerisindeki alanlar klasöründeki diğer MVC sitelerini yükler ve bunları kendi içine dahil eder. Yani temelde bir Plugin sistemi olarak davranır. Tüm bunlar harika çalışıyor ancak API'yı başka bir eklenti yapsam çok daha kolay olacağını düşündüğüm bu site için bir API eklemem gerekiyor.MVC Yönlendirme (WebAPI gibi)

Sitemde Ninject'i kullanıyorum, bu da eklentileri eklentilerden mükemmel şekilde almak için harika çalışıyor. Sorun, Ninject'in MVAP Denetleyicilerini otomatik olarak algılaması ancak WebAPI'leri değil, bir projenin hem WebAPI hem de MVC'yi Nijnect ile yapamayacağınızı öğrendim. Bir sonraki seçenekim de MVAP içinde WebAPI'yi denemek ve taklit etmektir (hepsinden sonra, gerçekten de aynı şeyi temel alırlar.)

Öncelikle bu işlemin gerçekten kolay olacağını düşündüm. ve her bir yönteme 'AcceptVerbs' dekorasyonunu koydular. Tabii ki işe yaramadı.

Herkes, yalnızca MVC tarafını kullanarak (WebAPI'ye geçmemek üzere) bir RestAPI gibi bir şey yaratmaya nasıl gideceğimi veya bir alternatifi biliyor mu?

cevap

0

birlikte Knockout kullanıyorum Not fiil bir HttpMethodContraint geçirerek hangi eylem gider hangi HTTP belirtebilirsiniz WebAPI'yi taklit edecek denetleyicilerinizi yönlendirin.

0

Denetleyicileri her zamanki gibi kullanabilir ve JsonResult numaralı ürünü iade edebilirsiniz. Bu yaklaşımı, arama yoluyla dinamik listelere ihtiyaç duyan bazı görünümler için kullanıyorum, ancak web api'ye gitmeye gerek duymuyorum. Öznitelik yönlendirme ile birlikte, MVC

'dan web api benzeri işlevsellik elde edebildim. Örnek senaryo, bazı alanları bir birleşik giriş kutusundan seçilen bir değere göre dolduran bir formum var. Bir kullanıcı bir seçenek belirlediğinde, denetleyicimdeki WebAPI benzeri eylemi aramak için JQuery'yi kullanıyorum.

[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 }); 
    } 

} 

İstemci tarafında javascript'in bir pasajı var.

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

Bu sizi sağlayacaktır: Ben senin RouteConfig.cs dosyasında 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 : ""); 
    } 
};