【问题标题】:Using AngularJS/.NET not as a SPA使用 AngularJS/.NET 不作为 SPA
【发布时间】:2015-03-26 09:57:49
【问题描述】:

这个问题可能不是很具体,但我想知道如何使用 AngularJS + ASP.NET MVC 创建一个非真正的 SPA 应用程序。

我即将启动 AngularJS 非常适合前端的项目:前端会有很多动态计算和情况,受益于 Angular 的双向绑定模型。

但是,我热衷于在可能的情况下在服务器端预加载和呈现页面,以减少一些不必要的 AJAX 请求。例如,与传统的 MVC 应用程序一样,此应用程序在 ViewBag 中实际获取和存储页面加载数据比将其强制放入 SPA 更有意义。当然,在某些情况下仍然会使用 AJAX,而这对于 Angular 来说是完美的。

我感兴趣的东西,例如:

  • 如何从 ViewBag 集合中初始化 Angular 模型?
  • 这种方法还有其他替代方法吗(我猜,Angular 仍然是一个有效的选择)吗?
  • 您是否遇到过有关该主题的任何论文/教程?

【问题讨论】:

    标签: asp.net-mvc angularjs


    【解决方案1】:

    我的回答将集中在:

    这种方法还有其他选择吗(我猜,Angular 仍然是一个有效的选择)?

    我不会说不要使用 AngularJS,但是我要说的是,如果您真正想要利用的只是双向数据绑定,请不要使用 SPA 框架。

    为什么?

    要么选择 SPA,要么不选择。引入一个 SPA 框架可能会让您在上述框架中构建越来越多的功能,并最终导致您的应用程序采用不一致的方法。

    也可能会认为 Angular 及其所有功能可能会使您的双向数据绑定模式过于复杂。

    替代品

    选择一个双向数据绑定库,我认为 ASP.NET MVC 的一个很好的匹配是 Knockout,因为它有很多支持(例如 ASP.NET MVC Helpers 等...)

    请看:

    http://knockoutjs.com/

    http://knockoutmvc.com/(用于淘汰赛的 ASP.NET MVC 扩展)

    继续前进

    此时选择使用数据绑定库而不是 SPA 框架不会限制您将来迁移到 SPA 架构(大多数库都与其他库兼容,当它们组合在一起时可以为您提供 SPA 架构),但是,当这一点到来时,您可以全面采取这一举措。

    【讨论】:

    • 感谢您的回答,并为 kmvc 明确 +1 - 看起来很有趣。
    【解决方案2】:

    您仍然可以使您的应用成为单页并使用 MVC。 Angular 使用局部视图作为视图,并没有说明这些不能在服务器上预渲染。

    MVC 控制器返回预渲染 Razor 视图以用于 Angular 的基本示例。

    public class PartialsController : Controller
    {
        [Route("Partials/{view}")]
        [Route("Partials/{view}/{sub?}")]
        public ActionResult Index(string view, string sub)
        {
            var partial = sub != null ? view + "/" + sub : view;
            try
            {
                return View(partial);
            }
            catch (Exception)
            {
                return HttpNotFound();
            }
        }
    }
    

    这里我正在生成一个大表,所以我使用 Razor 来“预绑定”模型并生成行,而不是使用 ng-repeat。

    @ { 
    Layout = null; 
    var project = new SomeController.GetCurrentProject(); 
    var keys = project.GetType().GetProperties().OrderBy(x => x.Name); 
    }
    <!-- Quick'n'dirty table view -->
    
            <table class="table table-responsive project-name-table">
                <tr>@{ foreach (var key in keys) 
                    {
                    <th ng-if="visibleFilter.@key.Name"> 
                     <a ng-click="order.on='@key.Name';order.reverse=!order.reverse">@key.Name</a>    
                    </th>
                     } 
                    }
            </table>
    

    【讨论】:

    • 这是一个有趣的方法——我将做一个小测试来看看这个预绑定的实际效果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 2015-07-03
    • 1970-01-01
    • 2015-10-22
    • 2014-11-17
    • 2017-04-30
    • 2014-12-01
    相关资源
    最近更新 更多