簡體   English   中英

MVC 路由(如 WebAPI)

[英]MVC Routing (like WebAPI)

我知道這聽起來像是一個愚蠢的問題,但是有沒有辦法為 MVC 控制器“模仿”WebAPI 路由樣式(即可能使用 [HttpPost] 裝飾等)。 我的問題的要點是我有一個“容器”MVC 站點。 這包含在 PreLoad 中加載區域文件夾中的其他 MVC 站點並將它們合並到自身中。 所以它基本上充當插件系統。 這一切都很好,但是我需要為這個站點添加一個 API,我認為如果我將 API 作為另一個插件制作會更容易。

我在我的網站中使用 Ninject,這再次非常有效,可以完美地從插件中獲取依賴項。 問題是 Ninject 會自動檢測 MVC 控制器,但不會檢測 WebAPI 控制器,我發現您不能讓一個項目同時使用 Nijnect 執行 WebAPI 和 MVC。 所以我的下一個選擇是嘗試在 MVC 中模仿 WebAPI(畢竟,它們實際上基於相同的東西。)

我最初認為這真的很容易,在路由中默認操作名稱為“Index”,他們只是在每個方法上放置“AcceptVerbs”裝飾。 當然沒有用。

有誰知道我會怎么做或只使用 MVC 端(不切換到 WebAPI)來創建類似 RestAPI 的東西?

在 RouteConfig.cs 文件中,您可以通過傳遞 HttpMethodContraint 來指定哪個 HTTP 動詞執行哪個操作:

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

這將允許您定義到將模仿 WebAPI 的控制器的路由。

您可以像往常一樣使用控制器並讓它們返回JsonResult 我將這種方法用於我的一些需要通過查找動態列表但不需要轉到 web 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 片段。 注意我將KnockoutJQuery一起使用

//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 : "");
    }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM