6

我有一个与使用淘汰赛和 ASP.NET Web API 进行客户端验证相关的问题。我希望视图是完全静态的(可能不包括根 index.html/cshtml),并且我不想通过手动在 js 中编写数据注释属性规则来重复自己。

我的上下文是 Durandal 上的中型(约 20-40 个实体,带有 biz 层)应用程序。

我发现的不成功/不适当的方式及其解释:

1. 使用 Breeze.js

乍一看,Breeze.js 看起来正是我所需要的。工作原理:它通过 /Metadata 链接共享 json,然后将其映射到knockout.valudate 插件。一切都很好,但是共享实体对我来说看起来很奇怪(我需要忘记 Nunit、复杂的服务器逻辑等等......而且将你的数据上下文公开是很可怕的:不安全且不安全!)。使用 JObject 参数保存方法对我来说也很奇怪。

2. 从 Web api 获取数据,从 Breeze 或 Web Api 获取元数据(如何?)并在客户端进行转换

我找到的唯一解决方案就是这个:https ://github.com/johnculviner/FluentKnockoutHelpers 。它在cshtml中呈现所有元数据(它不是那么重要,但从我的角度来看并不好)元数据,然后他将其映射为knockout.validate。可能有一个类似的现成框架具有类似的功能,我可以通过 json 从 api 获取元数据并提供淘汰赛?

3. 在构建时在 html 中渲染 cshtml

复杂的构建过程!

您是否有其他针对静态 HTML 和 Web API 应用程序的解决方案?

4

1 回答 1

1

首先,我们必须首先就一件事达成一致——

如果您没有 JavaScript 经验,那么第一次使用 Breeze 从服务器获取数据可能会很棘手

让我们看看一些原因以及如何克服这一挑战的示例,或者跳过非必需阅读并讨论使用 Breeze.js 或任何客户端应用程序时的安全性 -

<!--
    If you think this next section is 'Too Long' : 'Don't Read'
        and are just interested in security, skip down until
        you see 'Why is Breeze.js secure?'
-->

<section role="TL:DR">

微风.js 上的文档总是在更新和改进,但作为一个社区,我们可以改进以了解更多关于如何利用微风.js。这里有一些提示方法以及如何在客户端应用程序中设置微风.js 的一些基本场景 -

基本场景

  1. 从 Web API 控制器操作获取数据 -

    您可以将 Breeze.js 设置为在使用 Web API 路由时使用它自己的元数据 -

    http://www.breezejs.com/documentation/web-api-routing http://pluralsight.com/training/Courses/TableOfContents/building-single-page-applications-breeze

  2. 使用 EF / Breeze.WebApi 从 Web API 控制器操作中获取数据

    您可以将 Breeze.js 设置为在 VS2012/13 中使用 ASP.NET MVC 5 / Web API 2 项目。如果您想了解如何使用服务器端 Breeze.WebApi 作为帮助程序,请查看此列表中的链接或 PluralSite.com 等在线教育网站 -

    http://www.breezejs.com/samples

    http://www.pluralsite.com

    在示例中,您将了解如何使用当前使用的 85% 的 Web 技术。这包括 Angular、Durandal、MongoDb、Node、Entity Framework、Require、Knockout、Ruby、Twitter Bootstrap、Backbone 等等……等等……

  3. 了解微风的工作原理 -

    http://learn.breezejs.com/

  4. 从完全解耦的 SPA 中访问服务器 -

    为什么要花时间建立自己的客户端数据库并创建对象图或使用不快速照明的映射库?JavaScript ORM 正在迅速风靡一时,因为为什么要不断重建轮子?微风怎么能做到?

    http://www.breezejs.com/samples/edmunds

    http://www.breezejs.com/samples/espn

    两个很好的例子,完全解耦的 API 可以被客户端技术使用,而无需将客户端的东西绑定到服务器端的任何特定堆栈。

为什么 Breeze.js 是安全的?

无论数据是什么或如何生成,您都不应该将任何数据暴露给外界。如果您在客户端或服务器端有一个应用程序在返回数据之前未正确验证其用户,那么您如何确保在查看客户端技术之前正确验证?

使用 saveChanges() 发回数据时会怎样?

在极少数情况下,我会设计一个让浏览器自由漫游以发布/更新我的数据库的应用程序。一种可能是,如果要更改的内容处于非常早期的开发周期中,我正在测试获取和发布数据,并且设置了业务层及其允许的内容(可能通过单元测试验证)以允许不受限制地读取/写入数据.

但是将基于浏览器的应用程序转移到生产环境呢?

我永远不会在我没有阅读过并且 100% 确定该文件已准备好签署的文件上签名。我也永远不会将代码从开发或 QA 环境传递到生产环境,除非我使用的技术堆栈确保满足我的要求。如果使用 ASP.NET MVC 和 Session 存储用户信息是您的应用程序应该采取的方向,那么使用 [Authorize] 属性装饰您的控制器操作。如果您有另一种形式的安全性,那么您需要始终保持所暴露数据的适当安全级别。

永远不要相信基于浏览器的应用程序会为您提供非恶意内容,即使在 99.99% 的情况下 - 0.01% 可能是压垮骆驼的最后一根稻草。

于 2013-11-06T07:10:57.000 回答