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
请求错误
这是我的AngulardataService
工厂提供的一个函数,它将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投资组合)