我是 AngularJS 的新手,想将它用于我们基于 ASPNET MVC 的新项目。我希望 AngularJS 来管理视图(它将是混合 SPA,一些页面是正常的 MVC 生成的视图)。但我正在决定在服务器端选择什么。即 ServiceStack/WebApi/MVC 操作?网络上有 WebAPI 和常规 ASPNET MVC 的示例,但找不到任何 SS+Angular 示例。你能给我一个带有 SS+Angular 的示例项目吗(如何管理路由,防止视图(html 文件)被用户直接打开等)。
5 回答
几个月前,我为 Chicago Code Camp 2013整理了一个演示项目( https://github.com/paaschpa/ordersDemo)。AppHarbor上的示例站点似乎已关闭(我让 AppHarbor 站点正常工作,但我所有的“生产” configs'在 GitHub 存储库中。我永远无法在 GitHub 和他们之间获得正确的配置/设置),但我认为代码类似于您所要求的。它使用 AngularJS(可能不是最好的例子),.NET MVC w/ServiceStack 托管在 /api。它还使用 Twitter BootStrap、Redis Pub/Sub 和 SignalR……可能在这个项目/示例中加入了太多东西。如果您可以安装 Redis ( https://github.com/dmajkic/redis/downloads ) 并将其更改redisUrl
为localhost:6379
在 web.config 文件中,您应该能够让它在本地运行。
我在我的项目中使用 ServiceStack + ASP.NET MVC + Angular。
一旦安装了 ServiceStack(使用 nugget 包非常容易),调用 ServiceStack Rest WS 在服务中使用 Angular 非常简单:
GetById: function (movieId) {
var url = root + 'api/movie/' + movieId;
var promise = $http({ method: 'GET', url: url }).then(function (response) {
return response.data;
});
return promise;
}, ...
在 ServiceStack 中,我像这样使用 DTO 和 ViewModel:
#region MovieDTO
[Api("GET Movie by Id")]
[Route("/movie/{Id}")]
public class MovieDTORequest
{
public int Id { get; set; }
}
public class MovieDTOResponse
{
public MovieViewModel Movie{ get; set; }
}
#endregion
并完成我的服务:
private MovieBusiness _movieBusiness= (MovieBusiness )UnityHelper.BusinessResolve<Movie>();
public object Get(MovieDTORequest request)
{
Movie movie = _movieBusiness.GetById(request.Id);
MovieViewModel movieViewModel = MovieAdapter.ToViewModel(movie);
return new MovieDTOResponse { Movie = movieViewModel };
}
关于路由,在我的案例中,我使用 ASP.NET MVC 路由,因为我更喜欢它。所以我创建了一个 BaseController 向每个视图发送 ServiceStack 用户:
[ProfilingActionFilter]
public class BaseController : ServiceStackController<CustomUserSession>
{
/// <summary>
/// Surcharge de l'action pour charger la notification dans le ViewBag s'il y en a une et l'a marquer comme delivrée
/// </summary>
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
int Id = 0;
UserViewModel user= new UserViewModel ();
if (int.TryParse(base.UserSession.UserAuthId, out Id))
{
user= new UserViewModel ()
{
id = Convert.ToInt32(base.UserSession.UserAuthId),
nom = base.UserSession.DisplayName,
roles = base.UserSession.Roles != null ? string.Join(",", base.UserSession.Roles.ToArray()) : string.Empty
};
}
ViewBag.User= user;
}
接下来,如果您需要将 ViewModel 直接传递给角度控制器,您可以这样做:
@model AddictLive.Core.ViewModel.Mobile.ViewModels.MovieViewModel
@using Newtonsoft.Json
<div ng-controller="MovieController" ng-init="init(@Html.Raw(JsonConvert.SerializeObject(Model)))">
...
</div>
角度控制器中的 init() 方法示例:
$scope.init = function (movieViewModel) {
$scope.property1= movieViewModel.property1;
$scope.property2= movieViewModel.property2;
};
我简化了所有示例以使其易于理解,但如果您需要更多解释,请告诉我
SocialBootstrap 项目包含一个体面的全栈设置,它使用了骨干.js 和 underscore.js,但不是有角度的——它可能有助于通读它。
https://github.com/ServiceStack/SocialBootstrapApi
虽然,在这个例子中,服务层与前端紧密耦合,因为它们都包含在同一个项目中。对于更大的 SPA,我会尽量避免这种情况。
我正在做一个 SS + AngularJs + SignalR,我可以对你说我对此并不后悔,我个人觉得这个框架非常直接,旨在仅使用插件和你的 IoC(在我的情况下,我使用 SimpleInjector )。
我分别研究了 Angular 和 SS,因为 Angular 中的 REST 调用可能与后端无关,但您仍然需要弄清楚诸如在前端和后端之间集成安全性、路由等
你可以在razorRockstarts找到一个使用 SS + angularJs 的小演示,你可以看看这篇文章 和其他文章。
我希望这会有所帮助