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

鲍勃

我有这个ASP.NET MVC 5项目,正在使用MS Web Api转换为AngularJS。

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

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

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

这是我的AngulardataService工厂中的一个函数,它使http请求降为'api/Whatif/SummaryPortfolios'

function getCurrPortfoliosLIst() {
  var deferred = $q.defer();

  var url = 'api/Whatif/SummaryPortfolios';
  var req={
    method: 'POST',
    url: url,
    headers: {
      'Content-Type': 'application/json',
    },
    data:{}
  };
  $http(req).then(function (resp){
    deferred.resolve(resp.data);
  }, function(err){
    console.log('Error from dataService: ' + resp);
  });
}

但是$http错误部分返回此异常:

data: Object
ExceptionMessage: "Multiple actions were found that match the request: 
↵SummaryPortfolios on type MarginWorkbenchNG.Controllers.WhatifController
↵Post on type MarginWorkbenchNG.Controllers.WhatifController"
ExceptionType: "System.InvalidOperationException"
Message: "An error has occurred."
StackTrace: "   at System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext)
↵   at System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext)
↵   at System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)
↵   at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()

这是我要调用的c#API控制器,但我需要弄清楚如何创建除直接Get()和Post()方法之外的方法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Http;
using Microsoft.AspNet.Identity;
using NLog;
using Microsoft.AspNet.Identity.Owin;
using MarginWorkbenchNG.Models;
using Rz.DAL;
using Rz.DAL.Integration;
using Rz.DAL.Models;
using Rz.DAL.Models.Rz;

namespace MarginWorkbenchNG.Controllers
{
    public class WhatifController : ApiController
    {
		public IEnumerable<string> Get()
			{						 
				return new string[] { "value1", "value2" };
			}
		[HttpPost]
        public List<WhatifSummaryViewModel> 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 model;
        }
	}
}

当然,旧的控制器(来自MVC5项目)看起来略有不同,因为该_Summary方法是类型的ActionResult并且返回a Partial

public class WhatifController : Controller
    {
      
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult _Summary(string filterValue = "", int? whatIfBatchNumber = null, bool includeBaseline = true)
        {
            // Get portfolios from Razor
            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 removed for brevity...

            return PartialView(model.OrderBy(x => x.Title).ThenBy(x => x.SubTitle));
        }

我的RouteConfig.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MarginWorkbenchNG
{
  public class RouteConfig
  {
    public static void RegisterRoutes(RouteCollection routes)
    {
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

      routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
      );
    }
  }
}

旧项目还使用Html表单提取URL,例如:

 <form id="whatif-summary-form" action="@Url.Action("_Summary", "WhatIf")" method="POST"></form>

然后action在JavaScript(非Angular)中构建ajax请求时拉出attrib以获得URL:

url: form.prop("action")
安德鲁·M。

这是您的整个ApiController吗?您收到的错误消息是因为您的ApiController具有几种相同类型的方法,并且无法确定要路由到哪个方法。要测试这一点,请执行以下操作:注释掉您要调用的控制器方法之外的所有方法。您不应该再收到该错误。

这是一个简单的解决方法,只需告诉Web API如何映射路线即可。将属性[[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);
        }
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

从ASP.NET MVC控制器将数据发布到ASP.NET Web API控制器时的待处理请求

来自分类Dev

Web API控制器将MemoryStream转换为StreamContent

来自分类Dev

如何将 ASP.NET MVC 核心视图和 ASP.NET WEB API 控制器分离到单独的项目中?

来自分类Dev

将存储库注入ASP.NET控制器的最佳方法是什么

来自分类Dev

使控制器对ASP.NET WEB API(或MVC)中的客户端不可见

来自分类Dev

从ASP.net MVC 4 WEB API控制器返回byte []

来自分类Dev

asp.net mvc / web api 2-控制器接受JSON对象数组

来自分类Dev

Json格式。使用Web Api控制器,ASP.NET MVC缩进

来自分类Dev

从ASP.net MVC 4 WEB API控制器返回byte []

来自分类Dev

Json格式。使用Web Api控制器,ASP.NET MVC缩进

来自分类Dev

Asp.net MVC项目中的Angularjs调用Web API控制器

来自分类Dev

如何在ASP.NET MVC控制器参数中将毫秒转换为DateTime

来自分类Dev

从Asp.net-mvc控制器操作返回File或ErrorMessage的最佳方法是什么?

来自分类Dev

ASP.NET MVC处理控制器中动态参数数量的最佳方法

来自分类Dev

可以将asp.net MVC控制器方法视为静态方法吗?

来自分类Dev

使用BeginForm将表单数据发布到ASP.NET MVC API控制器

来自分类Dev

在 asp .net mvc 中创建 Api 控制器

来自分类Dev

如何使ASP.NET MVC控制器方法异步

来自分类Dev

ASP.NET MVC 调用控制器方法 DevExpress

来自分类Dev

AngularJS $ http.post()将null发送到ASP.NET Web API控制器方法

来自分类Dev

AngularJS $ http.post()将null发送到ASP.NET Web API控制器方法

来自分类Dev

ASP.NET Web API控制器更新行

来自分类Dev

忽略ASP.NET Web API中的控制器

来自分类Dev

ASP.NET Web API帮助页省略了从基本控制器继承的控制器

来自分类Dev

ASP.NET Web API帮助页省略了从基本控制器继承的控制器

来自分类Dev

在ASP.NET MVC 5控制器中使用POST从dotnet Core Web API下载文件

来自分类Dev

特定于路由的 ASP.NET MVC Web API 消息处理程序不调用控制器操作

来自分类Dev

ASP.NET Web API 2-定义控制器到方法的映射?

Related 相关文章

  1. 1

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

  2. 2

    从ASP.NET MVC控制器将数据发布到ASP.NET Web API控制器时的待处理请求

  3. 3

    Web API控制器将MemoryStream转换为StreamContent

  4. 4

    如何将 ASP.NET MVC 核心视图和 ASP.NET WEB API 控制器分离到单独的项目中?

  5. 5

    将存储库注入ASP.NET控制器的最佳方法是什么

  6. 6

    使控制器对ASP.NET WEB API(或MVC)中的客户端不可见

  7. 7

    从ASP.net MVC 4 WEB API控制器返回byte []

  8. 8

    asp.net mvc / web api 2-控制器接受JSON对象数组

  9. 9

    Json格式。使用Web Api控制器,ASP.NET MVC缩进

  10. 10

    从ASP.net MVC 4 WEB API控制器返回byte []

  11. 11

    Json格式。使用Web Api控制器,ASP.NET MVC缩进

  12. 12

    Asp.net MVC项目中的Angularjs调用Web API控制器

  13. 13

    如何在ASP.NET MVC控制器参数中将毫秒转换为DateTime

  14. 14

    从Asp.net-mvc控制器操作返回File或ErrorMessage的最佳方法是什么?

  15. 15

    ASP.NET MVC处理控制器中动态参数数量的最佳方法

  16. 16

    可以将asp.net MVC控制器方法视为静态方法吗?

  17. 17

    使用BeginForm将表单数据发布到ASP.NET MVC API控制器

  18. 18

    在 asp .net mvc 中创建 Api 控制器

  19. 19

    如何使ASP.NET MVC控制器方法异步

  20. 20

    ASP.NET MVC 调用控制器方法 DevExpress

  21. 21

    AngularJS $ http.post()将null发送到ASP.NET Web API控制器方法

  22. 22

    AngularJS $ http.post()将null发送到ASP.NET Web API控制器方法

  23. 23

    ASP.NET Web API控制器更新行

  24. 24

    忽略ASP.NET Web API中的控制器

  25. 25

    ASP.NET Web API帮助页省略了从基本控制器继承的控制器

  26. 26

    ASP.NET Web API帮助页省略了从基本控制器继承的控制器

  27. 27

    在ASP.NET MVC 5控制器中使用POST从dotnet Core Web API下载文件

  28. 28

    特定于路由的 ASP.NET MVC Web API 消息处理程序不调用控制器操作

  29. 29

    ASP.NET Web API 2-定义控制器到方法的映射?

热门标签

归档