为了在使用angularjs行走之前进行爬行,我创建了一个简单的应用程序来使用webapi显示来自sql server表的结果。不幸的是,webapi永远不会被调用,因为路由错误,但我不知道如何解决。提琴手显示404错误。
cshtml如下,定义应用程序和控制器。
<script type="text/javascript">
var app = angular.module('streamApp', []);
app.controller('streamController', function($scope, $http){
$scope.loading = true;
$scope.addMode = false;
//Used to display the data
$http.get('/api/Stream/').success(function (data) {
$scope.streams = data;
$scope.loading = false;
})
.error(function () {
$scope.error = "An Error has occured while loading streams!";
$scope.loading = false;
});
});
</script>
cshtml文件中的呈现部分是
<div data-ng-app="streamApp" data-ng-controller="streamController" class="container">
....
</div>
webapi类位于MVC项目中名为WebApi的文件夹中,但由于从未到达过,因此无需显示其代码。无论如何它都是非描述性的。
路由配置如下:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
我不确定是否需要在angularjs代码或mvc route config中指定路由指令,以及确切要提供哪些功能或配置。我已经尝试将webapi类移动到Controllers文件夹,结果相同 - http 404.有关如何使这个示例获得webapi代码的任何建议都将不胜感激。
好热的......我通过在我的webapi类方法中添加注释解决了眼前的问题 [Route("api/stream")]
[System.Web.Http.HttpGet]
public IEnumerable<Models.StreamViewModel> Get()
{
.....
}
所以现在问题是应该用RouteConfig作为更好的做法吗?或者Route()注释是首选方式吗?或者是另外六个人中的6个?
答案 0 :(得分:1)
回答您的最新问题,路线的最佳做法:
Route()注释是执行此操作的首选方式。
MVC 5支持一种新类型的路由,称为属性路由。作为 name暗示,属性路由使用属性来定义路由。 通过属性路由,您可以更好地控制Web中的URI 应用
早期的路由风格,称为基于约定的路由,是 仍然完全支持。事实上,你可以将两种技术结合起来 同一个项目。
属性路由还有其他优点,例如
它将路径信息放在控制器操作的旁边 实现那条路线。这有助于调试和故障排除, 以及提供快速搜索路线的能力 解决方案中的信息。
降低了路线变更过程中的风险。在RouteConfig.cs或WebApiConfig.cs中(在Web API解决方案的情况下), 存在无意中改变错误路线的可能性 否则会对您申请的其他部分产生不利影响。
- 醇>
您可能还希望包含可接受的HTTP方法,允许的用户类型和注册优先级,如果包含在内 基于属性的路由,将所有这些信息放在一起 的地方。
这篇文章为我提供了上述灵感和强化,并详细介绍: http://kevinmontrose.com/2011/07/25/why-i-love-attribute-based-routing/
答案 1 :(得分:0)
您可以使用其中任何一种,但如果没有注释,您的端点将是api/get
而不是api/stream
(假设您没有重命名您的方法)。
答案 2 :(得分:0)
首先,你应该使用ApiController而不是Controller,因为它扮演api动作的角色。
其次,如果我们看一下,看起来你创建了一个名为ApiController的控制器和一个名为Stream的函数。否则,它误解了使用MVC设计Web集成。
App_Start \ WebApiConfig.cs:
using System.Web.Http;
class WebApiConfig
{
public static void Register(HttpConfiguration configuration)
{
configuration.Routes.MapHttpRoute("API Default", "api/{controller}/{action}/{id}",
new { id = RouteParameter.Optional });
}
}
的Global.asax.cs:
using System.Web.Http;
...
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
WebApiConfig.Register(GlobalConfiguration.Configuration);
RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
和ApiControllerNameController:// Controller字会关闭文件名,无需编写即可到达:
using System;
..
..
..
namespace MvcApplication1.Controllers
{
public class ValuesController : ApiController
{
// GET api/values/MethodName
public IEnumerable<int> MethodName()
{
return new List<int> { 1, 2, 3 };
}
}
}