WebApi中使用属性路由的自定义路由

时间:2015-11-04 14:40:57

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

我正在使用WebAPi从数据库中检索电影详细信息列表。我有http动词,它确实正常工作。我的情况是我要根据TitleDateRating等类别获取记录 WebConfig:

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

控制器:

[HttpGet]
[GET("api/GetMovieByCategory/{movieData}")]
public IEnumerable<MovieData> GetMovieByCategory(MovieData movieData)  
    {
        IEnumerable<MovieData> movieDataByCat = null;
        string[] paramCast;
        if(movieData.Cast.Count()!=0)
        paramCast = movieData.Cast;
        IEnumerable<MovieData> GetAllMovies = null;
        GetAllMovies = repo.GetAll();`

        if (movieData.Cast == null || movieData.Cast.Count() == 0)
        {
            movieDataByCat = from data in GetAllMovies
                             where (data.Classification == (movieData.Classification == null ? string.Empty : movieData.Classification) ||
                                    data.Genre == (movieData.Genre == null ? string.Empty : movieData.Genre) ||
                                    data.Rating == movieData.Rating ||
                                    data.ReleaseDate == movieData.ReleaseDate ||
                                    data.Title == (movieData.Title == null ? string.Empty : movieData.Title))

                             select data;
        }
        return movieDataByCat;
    }

Angular Service:

//GetByCategory
this.getbyCat = function (Movie) {
    return $http.get("/api/values/GetMovieByCategory/" + Movie);
};

当我尝试执行时,我得到如下例外,

Remote Address:[::1]:50948
Request URL:http://localhost:50948/api/values/GetMovieByCategory/[object%20Object]
Request Method:GET
Status Code:404 Not Found

我不知道如何克服这个问题并解决它。我在初级水平。请帮忙。

其余动词(get,put,post)正常运作。

注意:我为AttributeRouting.Web.Http;安装了NugetPackage Route

更新1: Contoller.js
$scope.srchbycat = function () { var Movie = { _title:"", _genre: "", _classification:"", _releaseDate: "", _rating: "", _cast: "" }; Movie = { _title: $scope.txttitle, _genre: $scope.txtGenre, _classification: $scope.txtClassification, _releaseDate: $scope.txtDate, _rating: $scope.user.txtRating, _cast: $scope.txtCast }; var promisePost = MyService.getbyCat(Movie);

最近的错误:
Remote Address:[::1]:50948 Request URL:http://localhost:50948/api/values/GetMovieByCategory/?_genre=sdf Request Method:GET Status Code:400 Bad Request

1 个答案:

答案 0 :(得分:1)

在Angular Service中,不是附加Movie对象,而是将其作为参数传递。

例如

//GetByCategory
this.getbyCat = function (Movie) {
    return $http.get("/api/values/GetMovieByCategory/", { params: Movie});
};

这将使HTTP获取属性作为url参数。

我不认为在路由定义中需要{movieData}参数,因为WebApi会自动将url参数序列化为对象MovieData

例如

index.js

angular.module('index.services', []).
factory('indexService', function ($http) {
      var api = 'api/values/GetData';
      var indexAPI = {};

      indexAPI.getData = function (params) {
          return $http.get(api, { params: params });
      }

      return indexAPI;
});
angular.module('index.controllers', ['index.services']).
controller('indexController', function ($scope, indexService) {
    $scope.getData = function () {
        var params = {
            name: 'test',
            age: '10'
        };
        $scope.errorOccured = false;
        indexService.getData(params).then(function (response) {
            $scope.data = response.data;
        }, function (response) {
            $scope.errorOccured = true;
        });
    }
});
angular.module('index', ['index.controllers']);

Index.cshtml

<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.0-beta.1/angular.js"></script>
<script src="~/Scripts/app/index.js"></script>
<div ng-app="index" ng-controller="indexController">
    <button ng-click="getData()">Get Data</button>
    <div ng-if="errorOccured==true">Error Occured</div>
    <div ng-repeat="item in data">
        <div>{{item}}</div>
    </div>
</div>

DataRequestModel.cs

public class DataRequestModel
{
    public string Name { get; set; }
    public string Age { get; set; }
}

ValuesController.cs

public class ValuesController : ApiController
{
    [HttpGet]
    public IEnumerable<string> GetData([FromUri]DataRequestModel dataRequest)
    {
        return new string[] { dataRequest.Name, dataRequest.Age.ToString() };
    }
}