C# MVC路由(如WebAPI)

C# MVC路由(如WebAPI),c#,asp.net-mvc,asp.net-mvc-routing,C#,Asp.net Mvc,Asp.net Mvc Routing,我知道这听起来像是一个愚蠢的问题,但有没有一种方法可以“模仿”MVC控制器的WebAPI路由风格(即可能使用[HttpPost]装饰等)。我的问题的要点是我有一个“容器”MVC站点。这将在预加载中包含加载区域文件夹中的其他MVC站点,并将它们合并到自身中。所以它基本上是一个插件系统。这一切都很好,但我需要在这个网站上添加一个API,我认为如果我把API作为另一个插件,这会容易得多 我在我的网站上使用了Ninject,它再次发挥了巨大的作用,从插件中获得了完美的依赖性。问题是Ninject会自动检

我知道这听起来像是一个愚蠢的问题,但有没有一种方法可以“模仿”MVC控制器的WebAPI路由风格(即可能使用[HttpPost]装饰等)。我的问题的要点是我有一个“容器”MVC站点。这将在预加载中包含加载区域文件夹中的其他MVC站点,并将它们合并到自身中。所以它基本上是一个插件系统。这一切都很好,但我需要在这个网站上添加一个API,我认为如果我把API作为另一个插件,这会容易得多

我在我的网站上使用了Ninject,它再次发挥了巨大的作用,从插件中获得了完美的依赖性。问题是Ninject会自动检测MVC控制器,但不会检测WebAPI控制器,我发现不能让一个项目同时使用NijNext执行WebAPI和MVC。因此,我的下一个选择是尝试在MVC中模仿WebAPI(毕竟,它们实际上是基于相同的东西)

我最初认为这非常简单,在路由中将操作名默认为'Index',他们只在每个方法上加上'AcceptVerbs'装饰。当然没用了


是否有人知道我将如何操作,或者是一种仅使用MVC端(而不是切换到WebAPI)创建RestAPI之类的东西的替代方法?

您可以像往常一样使用控制器,让它们返回
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代码片段。注意我使用的是
Knockout
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 : "");
    }
};
//从属性发货
self.ShipFromaddressid=ko.observable();
//基于id更新shipfrom地址
self.ShipFromaddressid.subscribe(函数(){getAddress();});
var getAddress=函数(){
var selectedAddressId={addressId:self.ShipFromaddressid()};
$.ajax({
url:“@(url.Action(c=>c.GetSenderAddress(null))”,
键入:“Post”,
contentType:'应用程序/json',
数据类型:“json”,
数据:JSON.stringify(selectedAddressId),
成功:HandlerResponse
});
};
var handleResponse=函数(数据){
if(data.success){
//console.log(数据地址);
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:);
}
};

在RouteConfig.cs文件中,您可以通过传递HttpMethodContaint来指定哪个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的控制器的路由