从 angularJs 控制器向网络 api 2 传递多个参数

Passing multiple paramters to web api 2 from angularJs Controller

我正在尝试从我的 angular 控制器调用 Web api 控制器上的 httpGet,但我无法执行任何操作来传递多个参数。

我试过将参数添加到路由中,(route/{email}/{firstName}/{lastName}.

我可以验证 angular 方法 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);
        }
    }
}

最后,angular(第 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。

感谢任何帮助。

要么将 get 方法更改为 post 并将参数作为模型传递,以便您可以接收模型作为 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});

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

因此,控制器可以简单地

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