我注意到 App/views 文件夹中的所有视图都是 html 类型,而不是 cshtml。我如何使用我习惯的 PartialViews 和 mvc3 的东西,例如剃须刀?
3 回答
Durandal 旨在创建一个完全位于一个页面内的应用程序。这样做的好处是用户体验就像桌面应用程序一样。此外,这允许应用程序轻松地移植到phonegap中,它可以作为本地移动应用程序运行,甚至可以使用appjs移植到桌面应用程序。
通过将整个应用程序作为 html、js 和 css 文件,您可以将整个应用程序压缩/缩小/丑化到一个文件中,并让服务器为您提供整个应用程序。然后应用程序只需调用 Web 服务来获取其数据。这可能是一个 mvc 控制器、一个 web api 或一些返回数据的 web 服务。您使用此数据绑定到浏览器模板并生成要显示的视图。
您还可以拥有一个混合应用程序,您的服务器可以为多个 durandal SPA 提供服务,然后您将拥有一组由单个站点提供服务的应用程序。
我看到许多来自 MVC 背景的人很好地询问为什么我不能将 CSHTML 文件用于我的 HTML。简短的回答是你可以,但这样做会失去很多好处。当您让服务器呈现您的 html 文件时,您将无法再压缩/缩小/丑化整个应用程序,因为您依赖服务器为您生成 html。
如果您更喜欢 cshtml,那么传统上这是针对 AJAX 丰富的应用程序,您的用户在其中调用一些 uri,服务器根据一些数据生成 HTML,将呈现的 html 发送回用户,并将其粘贴在屏幕的某个位置. 通过这个过程,您拥有的是一个 AJAX 丰富的站点,而不是一个 SPA。您失去了使该应用程序成为本机移动应用程序甚至桌面应用程序的能力。
如果您有兴趣将Razor/CSHTML 与 Durandal 和 Knockout 一起使用,则有一个开源选项:FluentKnockoutHelpers。它提供了 ASP.NET MVC 的许多“好用的、有帮助的”部分,允许您使用 Durandal 和 Knockout 的强大功能而几乎没有失败。
为了快速解决 Evan Larsen关于缩小(等)的出色观点:由于 FluentKnockoutHelpers 在运行时不运行任何逻辑,而只是生成标记,因此使用流行的 RazorEngine 项目为您的生产构建生成静态 HTML 文件非常简单,它可以让你运行 Razor 并从 C# 生成 HTML。这可以在 Durandal 所需的生产构建步骤之前运行(这为您提供了缩小等)
简而言之,它提供了一系列特性,使得进行 Durandal/Knockout 开发就像 ASP.NET MVC 一样简单。(您只需为大多数功能提供您的 JavaScript 模型所基于的 C# 类型。)您只需为复杂的情况编写 JavaScript 和未编译的标记,这是不可避免的,与 MVC 没有什么不同!(除了在 MVC 中,您的代码也很可能最终也会成为一个大的 jQuery 混乱,这就是您首先使用 Durandal/Knockout 的原因!)
特征:
- 使用类似于 ASP.NET MVC 的强类型、流畅的 lambda 表达式助手轻松生成 Knockout 语法
- 丰富的智能感知和编译器支持语法生成
- 流利的语法使创建自定义助手或扩展内置内容变得轻而易举
- OSS 替代 ASP.NET MVC 助手:随意添加社区中每个人都可以使用的可选功能
- 只需几行代码,即可针对所有当前/未来的应用程序类型和更改轻松地提供基于 .NET 类型和 DataAnnotations 的验证
- 客户端 JavaScript 对象工厂(基于 C# 类型)在例如列表中创建新项目,零麻烦或服务器流量
没有 FluentKnockoutHelpers 的示例
<div class="control-group">
<label for="FirstName" class="control-label">
First Name
</label>
<div class="controls">
<input type="text" data-bind="value: person.FirstName" id="FirstName" />
</div>
</div>
<div class="control-group">
<label for="LastName" class="control-label">
Last Name
</label>
<div class="controls">
<input type="text" data-bind="value: person.LastName" id="LastName" />
</div>
</div>
<h2>
Hello,
<!-- ko text: person.FirstName --><!-- /ko -->
<!-- ko text: person.LastName --><!-- /ko -->
</h2>
为 FluentKnockoutHelpers 提供 .NET 类型,您可以使用 Intellisense 和 Razor / CSHTML 中的编译器以风格方式执行此操作
@{
var person = this.KnockoutHelperForType<Person>("person", true);
}
<div class="control-group">
@person.LabelFor(x => x.FirstName).Class("control-label")
<div class="controls">
@person.BoundTextBoxFor(x => x.FirstName)
</div>
</div>
<div class="control-group">
@person.LabelFor(x => x.LastName).Class("control-label")
<div class="controls">
@person.BoundTextBoxFor(x => x.LastName)
</div>
</div>
<h2>
Hello,
@person.BoundTextFor(x => x.FirstName)
@person.BoundTextFor(x => x.LastName)
</h2>
查看Source或Live Demo以详细了解 FluentKnockoutHelper 在不平凡的 Durandal.js 应用程序中的功能。
为了快速解决 Evan Larsen 关于缩小(等)的出色观点:由于 FluentKnockoutHelpers 在运行时不运行任何逻辑,而只是生成标记,因此使用流行的RazorEngine 项目为您的生产构建生成静态 HTML 文件非常简单,它可以让你运行 Razor 并从 C# 生成 HTML。这可以在 Durandal 所需的生产构建步骤之前运行(这为您提供了缩小等)
您的 SPA 将受 MVC 呈现页面的限制。
<div id="applicationHost">
@Html.Partial("_splash")
</div>
MVC 页面可以提供菜单、侧边栏等。当然可以通过连接到客户端 SPA 中提供的 Pub/Sub 模型来监听 Durandal 事件。
利用 MVC 控制器并将不同的母版页、捆绑包交付给不同的 SPA。每个 CSHTML 页面可以调用不同的 main.js(main-viewport、main-uipanel.js 等)文件。
如果需要,有很多方法可以混合这两种技术。