Web API 2:最佳实践从控制器返回视图模型数据以$http成功结果

本文关键字:数据 模型 视图 结果 成功 http 返回 控制器 API 最佳 Web | 更新日期: 2023-09-27 18:19:56

我想知道在Web Api 2中处理数据(ViewModels(的推荐方法是什么。我已经用谷歌搜索了很多,发现了一些"接收",但我想知道处理这个问题的最灵活和最简单的方法是什么。

此调用返回错误 -->

GET http://localhost:63203/api/Gallery/GetPhotosForPage 404 (Not Found)

可能是因为一些签名错误..,。

这是$http调用(角度(:

var currPage = $location.path() || "Unknown"; 
$http({
    method: 'GET',
    url: '/api/Gallery/GetPhotosForPage',
    accept: 'application/json',
    data: JSON.stringify(currPage)   //currpage = ex. "/leftwing"
    })
        .success(function (result) {
            console.log(result);
            $scope.mystuff= result;
        });

这是控制器GET方法:/PriPhotosModel是视图模型...

[HttpGet]
    public object GetPhotosForPage(string currPage)
    {
        PhotoServices photoService = new PhotoServices();
        List<PriPhotosModel> priPhotos = photoService.GetPriPhotosForAllPhotographersOnPage(currPage);
        return Request.CreateResponse(HttpStatusCode.OK, priPhotos);
    }

Web API 2:最佳实践从控制器返回视图模型数据以$http成功结果

请注意,WebApi 基于反射工作,这意味着您的大括号 {vars} 必须与方法中的相同名称匹配。

因此,要匹配基于默认模板的示例 URL,例如api/gallery/test "api/{controller}/{id}" 您的方法需要像这样声明:

[HttpGet]
public object GetPhotosForPage(string id){
   return id;
}

其中参数 string currPage 替换为 string id

原因是因为默认路由使用名称id 声明参数:

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

Web Api v1 在 global.asax on application_start 事件中全局定义资源。假设您使用的是 Visual Studio 2013 并基于默认模板Microsoft您的方法可能如下所示:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    GlobalConfiguration.Configure(WebApiConfig.Register);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}

WebAPI 路由配置发生在WebApiConfig.Register中,而 MVC 配置发生在RouteConfig.RegisterRoutes

关于WebApi v2,它引入了称为路由属性的东西,这些属性可以与您的控制器类一起使用,并且可以促进路由配置。

例如:

 public class BookController : ApiController{
     //where author is a letter(a-Z) with a minimum of 5 character and 10 max.      
    [Route("sample/{id}/{newAuthor:alpha:length(5,10)}")]
    public Book Get(int id, string newAuthor){
        return new Book() { Title = "SQL Server 2012 id= " + id, Author = "Adrian & " + newAuthor };
    }
   [Route("otherUrl/{id}/{newAuthor:alpha:length(5,10)}/{title}")]
   public Book Get(int id, string newAuthor, string title){
       return new Book() { Title = "SQL Server 2012 id= " + id, Author = "Adrian & " + newAuthor };
   }
...