Asp.net core blazor 与 .net core mvc with razor

2024-01-08

使用 razor 与 blazor 之间的架构差异是什么?

文档建议我在使用 blazor 时必须编写一个 Web Api - 是否仍然可以像传统 razor 一样传递模型对象?


0 带有视觉解释的视频

我决定制作一个视频,因为有人问了有关 Blazor 的几个问题(也在其他论坛上),这种格式似乎更适合我可视化差异 - 而不是重复我的(较长)解释。与我的第一篇文章相比,该视频包含一些改进的版本(文本文章也更新了),这是我采用这种格式的第一个视频,因此欢迎任何反馈。如果您喜欢阅读没有太多可视化内容的经典文本,您可以在以下部分中找到其内容。当然,没有演示,这是我为了简化内容而制作的,但基本信息内容是相同的。

1.什么是传统多页面网站或应用程序?

首先,您需要对传统网站/应用程序的工作原理有一个基本的了解:对于每个调用/请求,您向服务器发送请求,服务器以complete整个页面的 HTML。这可以动态生成,例如使用 ASP.NET Core MVC 和 Razor 模板或 Razor 页面,甚至使用 PHP、Java、Python 等其他技术。假设您有一个显示预览的文章列表。

为了说明这一点,假设您有一个显示预览的文章列表(例如博客文章)。当用户点击read all,在传统的 Web 应用程序中,您通常有两种方法来实现这一点:

  1. 加载像 /view-article?id=123 这样的页面,上面的情况再次发生:加载文章页面的整个 HTML DOM
  2. 使用 JavaScript 发出 Ajax 请求,从 /api/get-article?id=123 等 API 加载所需内容并操作 DOM 将其显示在所需位置

如果没有 JavaScript,传统网站就无法交互。这意味着:页面加载和渲染后,不会再发生任何事情 - 除了用户通过单击链接加载另一个页面(包含整个 DOM) - 因此,它被称为“多页面”应用程序。

您可能会更喜欢第二种方法,因为它更快并且节省资源:您不必再次渲染整个页面(仅更改了一部分),而是停留在该页面上并仅加载您需要的新信息(文章本例中的内容)。特别是在需要加载和呈现许多资源的大页面上,JavaScript 方法对用户来说感觉更快。

如果您希望传统页面具有交互性,则需要 JavaScript。例如,您可以向某些 API 添加 ajax 调用,以便在用户单击按钮时显示一些数据,without必须重新加载整个页面。

简而言之,我们可以说,大部分工作都发生在服务器端。

2. 区别在哪里单页应用程序 (SPA)?

SPA 只有一个page,就完整呈现的 html 页面而言。如果您通过单击文章之类的方式导航到那里,它们会加载 JavaScript 应用程序。它处理那里的所有交互。如果用户点击一篇文章,则不会从服务器获取完整的 HTML 文档!相反,它只获取更改的部分,在本例中为文章。其他所有内容(例如导航栏、页脚、小部件等)都将保留在多页面应用程序中,如果不使用 js/ajax,则可能会重新加载。

您通常会在那里使用模块化组件和双向数据绑定。这意味着,变量链接到某个 HTML 元素。当变量更改时,元素会自动显示新值。在传统应用程序中,您必须手动创建事件处理程序来处理此问题。它可以被视为使用普通 JavaScript 继续开发单页应用程序,其中您需要更多的手动工作来归档数据绑定等内容。

对于用户来说,SPA 通常比在多页面应用程序上浏览页面要快得多。

简而言之,我们可以说,大部分工作都发生在用户浏览器的客户端。服务器仅提供静态内容(html、js、css)并提供 API,例如从数据库中获取条目或保存它们。

3. Blazor 与此有​​何关系?

实际上是 Blazor 应用程序is水疗中心。但与其他框架的主要区别在于,Blazor 允许您使用 C# 代码控制客户端和服务器端。为了展示这一优势,让我们看看其他 SPA 框架,例如 Angular:您可以使用 ASP.NET Core 构建 Angular SPA。在这种情况下,您可以使用 TypeScript 在 Angular 中编写客户端。如果需要访问数据,它会向 ASP.NET Core 服务器进行 API 调用,该服务器是 C# 的。它与 React 等其他框架类似,但这里使用 JavaScript 而不是 TypeScript。

这使得在两者之间共享代码变得困难:如果您有一个文章模型,则需要在服务器上用 C# 定义它,并在客户端上用 TypeScript 定义它。使用 Blazor,您只需在 C# 中定义一次,然后在两个站点上重复使用它。换句话说:您只需编写 C# 即可,无需关心 JavaScript*

*这就是 Blazor 背后的基本思想:到处使用 C#,而不需要 JavaScript 作为第二技术。但值得一提的是,您需要使用 Blazor 组件来完成此任务。如果您需要一些尚未移植到 Blazor 的库,您仍然需要处理一些 JS。然而,仍然有数据绑定等好处。在整个普通 JS 堆栈上使用它会需要一些工作,因此我建议从提供 Blazor 组件的 UI 库开始。

3.1 Blazor WebAssembly and Blazor服务器

现在您已经了解了基础知识,并且需要在两种口味之间做出决定:

Blazor WebAssembly

顾名思义,它基本上使用网络组装 https://webassembly.org/直接在浏览器中运行 C# 浏览器。它需要一个相对较新的浏览器,尚未在所有平台/浏览器上受支持 https://caniuse.com/wasm。还有 Chromium 或 Safari 等主要引擎尚不支持所有标准化功能 https://webassembly.org/roadmap/.

假设您有一个使用 C# 代码作为处理程序的按钮,如下所示:

 <button class="btn btn-primary" @onclick="IncrementCount">Click me</button>

IncrementCount是一个 C# 方法。代码被传输到客户端并在浏览器中执行。将其想象为浏览器内的 .NET Core 运行时,就像 Silverlight 但没有任何外部插件。服务器端甚至不需要 ASP.NET Core!只要您不需要服务器端的数据库之类的东西,它就可以从任何网络服务器提供服务。这使得应用程序更大(并且更慢,至少在第一次加载时)。

示例 Visual Studio 模板的大小超过 17 MB!通过压缩,可以减少到 7 MB——对于 hello world 应用程序来说仍然很大。通过在发布模式下发布应用程序,使用 gzip 可以减少到大约 7 MB 和 2.4 MB。 至少后续请求速度更快。这些 DLL 文件存储在浏览器缓存中,从而避免进一步的请求。 但可以离线使用(至少主要逻辑没有API调用)。因此,它有时被称为真正的 SPA——它可以与 Angular、React 和其他客户端框架相媲美。 由于 WebAssembly-Usage,调试可能会更加困难,目前它仅支持基于 Chromium 的浏览器。

不了解 WebAssembly?它是一个相对较新的开放标准,可生成字节码以改善加载和执行时间,从而实现更强大的 Web 应用程序 - 独立于语言。您不必被迫使用 JavaScript 等特定语言:由于生成了字节码,因此也可以使用 C++ 或 Rust 等其他语言。

简而言之,WebAssembly 可以被视为功能丰富的 Web 应用程序的下一代 JavaScript,其中 Blazor WebAssembly 是 C# 实现。由于浏览器运行时的原因,有些 API 在这里无法使用。例如套接字或 I/O 访问,如 File.Open 或 File.Write。

Blazor服务器

该应用程序在服务器上运行,仅使用 SignalR Websockets 将输出(例如单击事件的结果,这会增加另一个 HTML 元素中的一些计数器)传输到浏览器。这使得应用程序更小、更快,但需要服务器端更多资源,因为您有 SignalR 连接,并且它也是服务器上的虚拟 DOM - 使得在大型设置中扩展变得更加困难。

另一方面,这降低了对客户端的要求:它们不需要支持 WASM,因此它可以在较旧的浏览器或 WASM 支持受限的浏览器以及低端设备上运行。但由于每个操作都以 SignalR 调用结束,因此应用程序将无法离线工作 - 如果这是必需的,请选择 Blazor WebAssembly 而不是 Blazor Server。

选择什么?

正如上面指出的,这取决于您的需求。例如,如果您需要离线支持,Blazor 服务器就不是一个好的选择。如果你不确定我会更喜欢Blazor服务器只有当您计划部署非常大的应用程序时才真正担心这一点。

恕我直言,Blazor 服务器目前更流畅、更灵活。 Blazor Server 在 WebAssembly 之前也变得稳定。当 WebAssembly 进一步发展并得到更广泛的支持时,这一建议可能会在未来发生变化。

但在这种情况下,您可以稍后迁移!

Blazor WebAssembly 和 Server 都使用 Razor 组件。这意味着:您可以在两者之间进行更改,而无需重新编写整个代码。从 Blazor Server 迁移到 Blazor WebAssembly 时,仅需要执行一些迁移工作,例如浏览器外部的数据调用。原因是,Blazor WASM 完全在浏览器中运行,因此您需要像 ASP.NET Core API 项目这样的服务器部分来处理它们。

更多信息

我推荐官方文档中对ASP.NET Core Blazor的介绍 https://learn.microsoft.com/de-de/aspnet/core/blazor/?view=aspnetcore-3.1。另一章还描述了有关该平台的大量信息并提供了教程。他们更深入地讨论诸如数据绑定 https://learn.microsoft.com/de-de/aspnet/core/blazor/components/data-binding?view=aspnetcore-3.1 or 事件处理 https://learn.microsoft.com/de-de/aspnet/core/blazor/components/event-handling?view=aspnetcore-3.1仅举几例,并举例说明。为了进行基本概述,我尝试将其简短化。

也可以看看:Blazor WebAssembly 3.2.0 https://devblogs.microsoft.com/aspnet/blazor-webassembly-3-2-0-now-available/ and ASP.NET 核心 5 https://devblogs.microsoft.com/aspnet/announcing-asp-net-core-in-net-5/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Asp.net core blazor 与 .net core mvc with razor 的相关文章

随机推荐

  • 如何检测 Ionic 4 离子内容组件中的滚动到达终点?

    在 Ionic v3 ion content 中 有像 scrollTop 这样的属性 在 Ionic v4 中不再有这样的属性 我如何确定用户是否到达了内容的末尾 https ionicframework com docs v3 api
  • 有效使用reinterpret_cast?

    根据经验 以下工作 gcc 和 VC 但它是有效且可移植的代码吗 typedef struct int w 2 A struct B int blah 2 void my func B b using namespace std cout
  • Keras 使用 tf.data.Dataset 预测循环内存泄漏,但不使用 numpy 数组

    我在循环 Keras 模型时遇到内存泄漏和性能下降predict使用时的功能tf data Dataset为模型提供数据 但在使用 numpy 数组提供数据时则不然 有谁了解造成此问题的原因和 或如何解决该问题 最小可重现代码片段 复制 粘
  • 根据 WooCommerce 中的付款方式提高购物车商品价格

    我想根据所选的支付网关为购物车商品价格添加百分比值 我面临的问题是产品价格的变化没有更新产品价格 最初选择的价格始终显示 我怎样才能得到相应的改变后的价格 到目前为止我的代码 Set custom cart item price funct
  • 根据不同列中的值重复行

    我有一个交易数据框 每行代表两个项目的交易 可以将其想象为 2 个活动门票或其他东西的交易 我想根据销售数量复制每一行 这是示例代码 dictionary of transactions d 1 20 NYC 2 2 30 NYC 2 3
  • Gradle 构建找不到包“java.net.http”

    我已经在 Intellij 中建立了一个 Java 项目 当我在 Intellij 中构建我的项目时 一切正常 但是当我尝试使用命令行构建它时gradle build在项目目录中 Gradle 抱怨找不到 java net http 包 这
  • 使用 javascript 从数组中删除重复的对象

    我试图找出一种有效的方法来删除数组中重复的对象 并寻找最有效的答案 我环顾互联网 一切似乎都在使用原始数据 或者对于大型数组来说不可扩展 这是我当前的实现 可以改进并且希望尝试避免标签 Test prototype unique funct
  • 使用 Spring 和 Hibernate 的嵌套事务

    在我的应用程序中 有多个步骤 其中许多提交将通过多种方法按顺序进行 例子 A gt B gt C gt D gt E gt F gt G A 调用 B B 调用 C 然后 B 调用 D D 调用 E 依此类推 所有这些方法都有一些数据库操作
  • T-SQL 条件排序依据

    我正在尝试编写一个存储过程 它返回一个对象列表 其中包含用户选择的排序顺序和排序方向并作为 sql 参数传入 假设我有一个包含以下列的产品表 product id int name varchar value int created dat
  • 为什么这个 Javascript DOM 代码只能在 FF 上运行,而不能在 IE 上运行?

    create an instance of the XML parser if window ActiveXObject Checking if the browser is IE xmlDoc new ActiveXObject Micr
  • 为什么 innerHTML 返回“未定义”?

    我试图捕捉这个 div 中的 值 它是可编辑的 div class editable div Hey div 我想我可以通过 JavaScript 简单地做到这一点 var changedText editable div innerHtm
  • Iphone Textview 不调用 TouchesBegan

    我有一个文本字段 当我触摸屏幕上的其他位置时 通过我的 TouchesBegan 函数并辞职 等等 它会隐藏键盘 但是当我触摸 Textview 时 TouchesBegan 不会被调用 键盘也不会隐藏 有没有办法调用 TouchesBeg
  • F# 记录类型的序列化

    我知道如何使用可变对象在 F 中序列化 但是有没有办法使用 XmlSerializer 或 DataContractSerializer 使用记录类型进行序列化 反序列化 看起来有一种方法可以使用 KnownType 属性为有区别的联合执行
  • 随机密码生成器上的 OpenMP 多线程

    我正在尝试使用集成到 Visual Studio 2010 中的 OpenMP 多线程来制作快速密码生成器 假设我有一个基本的字符串生成器 它可以从字符串中随机提取字符 srand time 0 for i 0 i lt length i
  • PHP - 生成给定字符的所有可能组合

    Update 是的 我知道不建议将所有内容存储在单个数组中 我一次添加了 5000 个组合的限制 但出现了一个新问题 我可以得到前 5000 个组合 但我想不出任何东西可以生成其余的组合 5001 到 10000 10001 到 15000
  • 在 Spark scala 中将行转换为地图

    我有数据框中的一行 我想将其转换为 Map String Any 将列名称映射到该列的行中的值 有简单的方法吗 我是为字符串值做的 比如 def rowToMap row Row Map String String row schema f
  • 在程序重新启动之间保存状态

    如何声明一个可以永远保存刺痛的变量 我的意思是 如果用户关闭并重新启动程序 该字符串值不会丢失 如何才能做到这一点 有多种不同的方法来存储应用程序的状态 该方法实际上取决于您存储的数据类型和其他要求 Options Use the Sett
  • stanford corenlp,分割句子,缩写例外

    斯坦福 Corenlp 中有指定缩写的选项吗 例如句子中 The reason pt stayed at home was to rest pt 是病人的缩写 corenlp 错误地将其分成两个句子 我想知道如何将缩写列表传递给斯坦福大学的
  • 将 MAC 地址字节数组格式化为字符串

    我正在使用此代码来查找机器的 MAC 地址 此代码直接打印 MAC 地址 但我想将其作为字符串返回 我完全困惑了 请帮忙 try InetAddress add InetAddress getByName 10 123 96 102 Net
  • Asp.net core blazor 与 .net core mvc with razor

    使用 razor 与 blazor 之间的架构差异是什么 文档建议我在使用 blazor 时必须编写一个 Web Api 是否仍然可以像传统 razor 一样传递模型对象 0 带有视觉解释的视频 我决定制作一个视频 因为有人问了有关 Bla