Asp.net mvc 将Asp.Net MVC控制器转换为Web API的最佳方法

Asp.net mvc 将Asp.Net MVC控制器转换为Web API的最佳方法,asp.net-mvc,asp.net-web-api,asp.net-web-api2,Asp.net Mvc,Asp.net Web Api,Asp.net Web Api2,我有一个ASP.NETMVC5项目,我正在用MSWebAPI将它转换成AngularJS 现在在旧项目中,我有了Controller类型的c#Controller,但是在我的新项目中,我创建了一些ApiController类型的新Web Api控制器 现在我想在我的新项目中重用旧的控制器代码。这就是我的困惑 当我尝试将旧的控制器代码移植到我的Web Api控制器时,我得到一些前端$http请求错误 这是我的AngulardataService工厂提供的一个函数,它将http req设置为'api

我有一个
ASP.NETMVC5
项目,我正在用MSWebAPI将它转换成AngularJS

现在在旧项目中,我有了
Controller
类型的c#Controller,但是在我的新项目中,我创建了一些
ApiController
类型的新Web Api控制器

现在我想在我的新项目中重用旧的控制器代码。这就是我的困惑

当我尝试将旧的控制器代码移植到我的Web Api控制器时,我得到一些前端
$http
请求错误

这是我的Angular
dataService
工厂提供的一个函数,它将http req设置为
'api/Whatif/SummaryPortfolions'

函数getCurrPortfoliosLIst(){ var deferred=$q.deferred(); var url='api/Whatif/summaryportfolions'; var请求={ 方法:“POST”, url:url, 标题:{ “内容类型”:“应用程序/json”, }, 数据:{} }; $http(req).然后(函数(resp){ 延迟解析(响应数据); },函数(err){ log('来自数据服务的错误:'+resp); });
}这是你的整个ApiController吗?您收到的错误消息是因为ApiController有多个相同类型的方法,并且它无法判断要路由到哪个方法。要测试这一点:注释掉所有控制器的方法,除了您正在调用的方法。你不应该再收到那个错误了

这是一个简单的修复方法,只需告诉WebAPI如何映射您的路线。将属性“[Route(“yourroute”)]”添加到方法中,它应该可以工作

    public class WhatifController : ApiController
    {
        [HttpPost, Route("Your Route Goes here 'SummaryPortfolios'")]
        public IHttpActionResult SummaryPortfolios(string filterValue = "", int? whatIfBatchNumber = null, bool includeBaseline = true)
        {
            // Get portfolios from Rz
            IEnumerable<Portfolio> portfolios = GetPortfolios(filterValue, whatIfBatchNumber, includeBaseline)
                .Where(x => x.PortfolioKeys.Any(k => k.Type == Settings.Whatif.SidebarPortfolioKey && k.DisplayValue == filterValue));

            // View Model
            List<WhatifSummaryViewModel> model = new List<WhatifSummaryViewModel> { };

            /// additional code here...

            return Ok(model);
        }
    }
公共类WhatifController:ApicController
{
[HttpPost,Route(“您的路线是‘SummaryPortfolions’”)]
公共IHttpActionResult SummaryPortfolions(字符串filterValue=“”,int?whatIfBatchNumber=null,bool includeBaseline=true)
{
//从Rz获得投资组合
IEnumerable portfolions=GetPortfolions(filterValue、whatIfBatchNumber、includeBaseline)
其中(x=>x.PortfolioKeys.Any(k=>k.Type==Settings.Whatif.SidebarPortfolioKey&&k.DisplayValue==filterValue));
//视图模型
列表模型=新列表{};
///这里的附加代码。。。
返回Ok(型号);
}
}

请发布您的路由配置?@lrb-我在帖子底部发布了我的
RouteConfig.cs
。在阅读这篇帖子时,我相信我用
[HttpPost,Route(“WhatIfController/getsummaryportfolions”)装饰了我的SummaryPortfolions(0方法)
。它看起来正确吗?@bob如果它是一个GET方法,那么你不应该用HttpPost来修饰它。只需删除HttpPost属性。我希望大部分内容都是POST。我还看到WebApi 2中在命名路由方面有更大的灵活性。这非常有用。我将有很多方法可以调用,因为我正在讨论从Asp.Net MVC“Web Pages”到AngularJS/WebApi。真正的答案是从一个新的
Web Api
项目开始,而不是从MVC“转换”。Web Api项目允许我设置我的REST端点,并从JavaScript.old发出clearn$http post请求,但我也会从路由中删除控制器(WhatIf/Summary投资组合)