【问题标题】:Backbone.js with ASP.NET MVCBackbone.js 与 ASP.NET MVC
【发布时间】:2011-11-01 11:04:33
【问题描述】:

在过去的几天里,我一直在阅读有关 Backbone.js 以及它如何简化 JS 代码与 View 元素的交互,基本上是在 HTML 中。我还阅读了 KnockoutJS 和 Backbone.js 之间的差异。现在我在考虑是否使用其中一种不可避免地会导致在我们的视图中复制我们已经在我们的 MVC 应用程序中拥有的代码(主要是 ViewModel 和 global.asax 中的路由)。本质上要求我们在 Backbone 或 Knockout 中编写另一组模型。据我了解,在使用 KnockoutJS 时,这种情况更加普遍,这就是为什么我认为我会选择 Backbone,但现在我认为它并没有那么不同 - 在几个示例之后,我看到相同的重复变得很明显。

如果我们已经有一堆 MVC 部分视图,现在我们应该使用一些模板引擎(如 JQuery 模板)在 Backbone 中重新创建它们,我们如何维护这样的应用程序?

【问题讨论】:

  • 同样的问题一直困扰着我,我很高兴你问了这个问题

标签: jquery asp.net-mvc-3 backbone.js knockout.js jquery-templates


【解决方案1】:

我自己最近一直在阅读backbone和knockoutjs,也在思考如何利用asp.net mvc的框架。 避免模​​型重复的一种方法是序列化(json)服务器端视图模型并将其用作主干或淘汰模型。积极的副作用是,您的客户端模型已经包含页面加载时的数据,并且在首次加载页面时不必通过 ajax 请求获取数据。 我知道仅序列化服务器端视图模型对于骨干网/淘汰赛是不够的,但这可能是一个起点。也许序列化模型可以是客户端模型上的一个属性。

关于jquery模板,我一般把jquery模板放在局部视图中。这样它们就可以轻松地呈现在您的视图中,如下所示:

<script id="SomeTemplate" type="text/x-jquery-tmpl">
    @Html.Partial("Templates/SomeTemplate")
</script>

显然,移植现有应用程序以利用 jquery 模板需要一些时间和精力。

【讨论】:

  • 这确实提供了一些额外的有用信息。希望其他人也能回答。
  • 嗨,我是新来的主干和 knckout。一个小问题......我需要在主干.js 中使用路由器吗(我目前正在使用 asp.net mvc4 webapi)。我什至觉得它更好地使用 mvc 4 web api 的淘汰赛(因为不需要路由器或控制器等,backbone.js 提供......?)
【解决方案2】:

我曾经在一个项目中使用了带有 Rails 的主干,最后我在 Underscore 中重做了所有模板 - underscore.js 是 Backbone 的依赖项,并带有自己的模板语言。

我的应用程序并不庞大,因此最终不会花费很多时间。如果您的应用已经相当复杂,那么情况可能就不同了。

就像 Suhas 所说,Backbone 的集合能够从服务器获取所有模型,并且您可以使用搭载 Jquery 的 ajax 调用的保存功能将它们发回。您所要做的就是确保它们通过 JSON 序列化。

我发现了一个最近的 4 部分系列,介绍了将 Backbone 与 ASP.NET MVC 3 结合使用 - 也许它会对您有所帮助:http://www.bitcandies.com/blog/2011/asp-net-mvc3-restful-application-tutorial-with-backbone-js-part-i/

另外,当我尝试使用 .net mvc 时,这为我提供了一个很好的参考:)

【讨论】:

    【解决方案3】:

    我推荐 ddango 在他的评论中对他的回答所说的话。开始使用主干或淘汰赛开发新功能。我们有一个 Web 应用程序,该网站的大部分内容都在传统的 asp.net mvc 中,一旦我们了解了淘汰赛,我们就开始利用淘汰赛创建页面。他们可以和平共处。如果那时出于任何原因(可维护性或您手上有太多时间;))都希望替换旧功能。然后你可以一次做一块。

    我们开始采取的策略是让asp.net mvc 控制器具有两种功能。

    1. 返回数据的操作(由敲除用于填充模板/控件)
    2. 返回 HTML 的操作用于页面请求。

    HTH

    【讨论】:

      【解决方案4】:

      如果你不想将你的部分重写为模板,你可以使用控制器方法来处理它们,这些方法会将部分视图返回为 html,你在渲染或初始化 Backbone 视图时检索它,例如:

              public ActionResult SomeAction(){ 
                 var viewModel = new ViewModel(); 
                 return View("~/path/to/partial/view.ascx", viewModel); }
              }
      

      您可以通过首先在客户端检索视图模型(或构建它)然后将其发布到操作而不是在操作中创建视图模型来进一步使用此方法。

      (不过,当您迁移到模板时,我认为这只是一个过渡阶段——当您可能已经拥有数据客户端并且只需要模板字符串时,您总是会发布帖子来呈现某些内容)

      re:ViewModels,通过JsonResult 或通过序列化从控制器加载数据是可行的方法。您不需要为 Backbone 模型复制太多代码 - json 被加载到模型中并解析为您可以通过 Backbone api 访问的属性。

      绝对推荐这些文章(虽然不是asp.net mvc特定的):

      http://backbonetutorials.com/what-is-a-model/

      http://www.jamesyu.org/2011/01/27/cloudedit-a-backbone-js-tutorial-by-example/

      cloudedit 教程是一个落后的版本(Controllers 现在是 Routers),但仍然是一个不错的起点 - Rails 和 ASP.NET MVC 之间的相似之处很容易看出。

      虽然不能对淘汰赛说话!

      【讨论】:

      • 你知道,我收回了。我真的完全不能推荐这种模式。如果您有时间尝试获取数据然后调用以获取 html,那么您可能有时间重写一些模板。
      • 我会继续说,如果您的应用程序非常大,如果可以的话,只需使用 Backbone 开发新功能,然后慢慢向新的做事标准迈进。我们一直在对我们的应用程序做类似的事情——它的核心是网络表单,但我们正在使用 Backbone 在 MVC 之上开发大多数新功能。
      • 我有点明白你在说什么,但你能否发布一对控制器操作和 MVC 部分视图(或常规视图)的代码,其中包含 Backbone.js 代码?这样会更容易理解,因为您在上面发布的返回部分视图的代码段及其对应的模型非常标准且直接。我想看看在 Views 中引入 Backbone.js 时的样子。
      【解决方案5】:

      您可以将 ASP.NET MVC 应用程序用作为您的视图模型发出 JSON 的 RESTful 服务。 Backbone 模型可以直接映射到这个 JSON。

      【讨论】:

      • 这确实意味着我必须重写我的操作以发送 JSON 数据,而现在它们返回附加到模型的 View/PartialView,不是吗?重写现有的或编写额外的处理 JSON 的?
      • 没错。我将采取的方法是,我编写的所有新操作都将返回 JSON,并且我将逐步重构现有操作以返回 JSON。
      猜你喜欢
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      • 2012-07-07
      • 1970-01-01
      • 2016-01-08
      • 1970-01-01
      • 2012-06-27
      • 2010-09-07
      相关资源
      最近更新 更多