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);
}
请注意,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 };
}
...