从angularJs Controller传递多个参数到web api 2

时间:2018-03-21 05:09:23

标签: angularjs asp.net-web-api asp.net-web-api2

我试图从我的角度控制器调用web api控制器上的httpGet,但我能做的任何事情都不允许我传递多个参数。

我尝试将参数添加到路线中,(route/{email}/{firstName}/{lastName}

我可以验证角度方法getCurrentAlumniInfo是否被调用并且正在尝试路由到控制器。我使用Postman,使用以下URI,

"localHost: PortNumber/api/alumni/currentAlumniInfo?Email=flintrock&FirstName=Fredf&LastName=Flintstone"

以下是相关摘要。首先,WebApiConfig使用属性路由:

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );


            var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
            jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
        }
    } 

接下来我的api控制器

 [RoutePrefix("api/Alumni")]
 public class AlumniController : ApiController
 { 
        private readonly AlumniRepository _repository;
        private readonly AuthRepository _authRepository;

        public AlumniController()
        {
            _repository = new AlumniRepository();
            _authRepository=new AuthRepository();
        }

        [Route("alumniInfo")]
        [HttpGet]
        public IHttpActionResult GetAlumniInfo([FromUri]string email,string firstName, string lasttName)
        {
            return Ok("Success" + lasttName);
        }
    }
}

最后,角度(v.1)

 var getCurrentAlumniInfo = function() {

            var alumniData = alumniModel.buildAlumniMatchData();
            var deferred = $q.defer();
            //string email, string lastName,string middleName, string firstName
            $http.get(serviceBase + 'api/alumni/alumniInfo',
                {
                    params: {
                        Email: encodeURIComponent(alumniData.email),
                        FirstName: alumniData.firstName,
                        //MiddleName: alumniData.middleName,
                        LastName: alumniData.lastName
                    }
                })
                .then(function(response) {
                    deferred.resolve(response);
                })
                .catch(function(response) {
                    alert(response.statusCode + " error: " + response.status);
                    deferred.reject(response);
                });
            return deferred.promise;
        };

为了它的价值,我使用了v.4.5.2的框架和Visual Studio 2015.

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:0)

您应该将 获取 方法更改为 发布 并将参数作为模型传递,以便您可以将模型作为API的参数接收。

<强>服务

$http.post(serviceBase + 'api/alumni/alumniInfo',
            {
                params: {
                    Email: encodeURIComponent(alumniData.email),
                    FirstName: alumniData.firstName,
                    //MiddleName: alumniData.middleName,
                    LastName: alumniData.lastName
                }
            })
            .then(function(response) {
               ...
            })
            .catch(function(response) {
             ...
            });

模型

 public class RecieveModel
  {
            public string Email  {get;set;}
            public string FirstName {get;set;}
            public string LastName{get;set;}
  }

API

    [Route("alumniInfo")]
    [HttpPost]
    public HttpResponseMessage GetAlumniInfo(ReceiveModel model)
    {
        return Request.CreateResponse(HttpStatusCode.OK);
    }

更改路线配置defaults: new { id = RouteParameter.Optional ,id1 = RouteParameter.Optional,id2 = RouteParameter.Optional} );

config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}/{id1}/{id2}",
                defaults: new { id = RouteParameter.Optional ,id1 = RouteParameter.Optional,id2 = RouteParameter.Optional});

答案 1 :(得分:0)

如果其他人在这里寻求解决问题,这对他们没有帮助 - 除非他们的编码太晚了。答案在我的代码中。我输入了一个带有两个t的参数字符串lasttname。是的,它实际上是那么容易和那个愚蠢的我看了一个小时没有意识到它。今天早上只看到这个问题,就像480磅一样突出了两个。字体。 使用属性路由,实际上所需要的只是参数名称与URI变量名称匹配。可以创建模型并将[FromUri]属性添加到参数中,但在这种情况下不需要。

所以,控制器可以简单地

[Route("alumniInfo")]
[HttpGet]
public IHttpActionResult GetAlumniInfo(string email, string firstName, string lastName)
{
    return Ok("Success" + lastName);
}