2016-03-22 4 views
-1

これは疑問な質問のように聞こえるが、WebAPIルーティングスタイル(つまり、[HttpPost]装飾など)をMVCコントローラに '模倣'する方法がある。私の問題の要点は、私は 'コンテナ'のMVCサイトを持っているということです。これはPreLoadに含まれているため、エリアフォルダ内の他のMVCサイトがロードされ、それ自体に組み込まれます。したがって、基本的にPluginシステムとして機能します。これはすべて素晴らしいですが、このサイトのAPIを追加する必要があります。これは、APIを別のプラグインとして作成した場合にはずっと簡単です。MVCルーティング(WebAPIのような)

私は自分のサイトでNinjectを使用しています。これは、プラグインからの依存関係を完全に完全に得るのにもうってつけです。問題は、Ninjectが自動的にMVCコントローラを検出するが、WebAPIコントローラは検出しないことで、WebAPIとMVCの両方をNijnectで実行するプロジェクトが1つもないことがわかった。だから私の次の選択肢は、MVC内のWebAPIを模倣しようとすることです(結局、彼らは同じことに本当に同じことに基づいています)。

私は最初これが本当に簡単だろうと思っていました。彼らは各メソッドに 'AcceptVerbs'デコレーションを置くだけです。もちろん、それは動作しませんでした。

MVAP側(WebAPIに切り替わらない)だけを使用してRestAPIのようなものを作成する方法については誰にも分かりますか?

答えて

0

とともにKnockoutを使用しています注意してください、あなたは動詞がHttpMethodContraintを渡すことによって、どのアクションに行くどのHTTPを指定することができますWebAPIを模倣するあなたのコントローラへのルートを定義します。

0

通常のようにコントローラを使用して、JsonResultを返すことができます。私はこのアプローチを、ルックアップを通して動的なリストを必要とするが、ウェブAPIに行く必要はない、私のビューのいくつかに使用する。属性のルーティングに加えて、私はMVCからWeb APIのような機能を得ることができました

私は、コンボボックスから選択された値に基づいていくつかのフィールドを埋めるフォームを持っています。ユーザーがオプションを選択すると、JQueryを使用して自分のコントローラーでWebAPIのようなアクションを呼び出すことができます。

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

} 

ここには、クライアント側のjavascriptのスニペットがあります。

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

これはあなたをできるようになります:私はあなたのRouteConfig.csファイルで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 : ""); 
    } 
};