在 C# 中实现 Blazor 应用需要结合 Razor 语法和 C# 代码,Blazor 允许使用 C# 同时开发前端和后端逻辑。以下是一个完整的 C# Blazor 实现示例,包含项目创建、基础组件和数据交互等内容:

一、创建 Blazor 项目

  1. 使用 Visual Studio

    • 新建项目 → 选择 “Blazor App” → 勾选 “ASP.NET Core 托管”(可选 WebAssembly 或服务器端渲染)。
  2. 使用.NET CLI 

    dotnet new blazorwasm -n BlazorDemo  # WebAssembly客户端渲染
    dotnet new blazorserver -n BlazorDemo  # 服务器端渲染
    

二、基础 Blazor 组件示例(C#)

以下是一个显示当前时间的 Blazor 组件(.razor文件):

@page "/"  // 路由路径<h3>Blazor时间组件</h3>
<p>当前时间:@currentTime</p>
<button @onclick="UpdateTime">刷新时间</button>@code {private string currentTime;protected override void OnInitialized(){UpdateTime();}private void UpdateTime(){currentTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");StateHasChanged();  // 通知组件状态更新}
}

三、数据绑定与交互

Blazor 支持双向数据绑定和事件处理:razor

@page "/form"<h3>用户表单</h3>
<div><label>姓名:</label><input type="text" @bind="userName" /><p>输入的姓名:@userName</p>
</div><div><label>年龄:</label><input type="number" @bind="userAge" /><p>年龄:@userAge</p>
</div><button @onclick="SubmitForm">提交</button>@code {private string userName;private int userAge;private void SubmitForm(){if (string.IsNullOrEmpty(userName)){message = "姓名不能为空";return;}message = $"用户 {userName},年龄 {userAge} 已提交";}private string message;
}

四、组件间通信(父子组件)

父组件(ParentComponent.razor)razor
<h3>父组件</h3>
<p>父组件消息:@parentMessage</p>
<ChildComponent @bind-ChildMessage="parentMessage" />@code {private string parentMessage = "来自父组件的初始消息";
}
子组件(ChildComponent.razor)razor
<h4>子组件</h4>
<input type="text" @bind="childMessage" />
<p>子组件接收到的消息:@childMessage</p>@code {[Parameter]public string ChildMessage { get => childMessage; set {if (childMessage != value){childMessage = value;OnChildMessageChanged.InvokeAsync(childMessage);}}}private string childMessage;[Parameter]public EventCallback<string> OnChildMessageChanged { get; set; }
}

五、HTTP 数据交互

Blazor 内置HttpClient用于 API 调用:

@page "/fetch-data"
@using System.Net.Http
@using BlazorDemo.Shared  // 假设模型在此命名空间<h3>获取天气数据</h3>@if (forecasts == null)
{<p><em>加载中...</em></p>
}
else
{<table class="table"><thead><tr><th>日期</th><th>温度</th><th>摘要</th></tr></thead><tbody>@foreach (var forecast in forecasts){<tr><td>@forecast.Date</td><td>@forecast.TemperatureC &deg;C</td><td>@forecast.Summary</td></tr>}</tbody></table>
}@code {private WeatherForecast[] forecasts;// 注入HttpClient[Inject]private HttpClient Http { get; set; }protected override async Task OnInitializedAsync(){forecasts = await Http.GetFromJsonAsync<WeatherForecast[]>("sample-data/weather.json");}// 天气模型(通常放在Shared项目中)public class WeatherForecast{public DateTime Date { get; set; }public int TemperatureC { get; set; }public string Summary { get; set; }public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);}
}

六、Blazor 项目结构说明

plaintext

BlazorDemo/
├── Client/                # WebAssembly客户端项目(若选择ASP.NET Core托管)
├── Server/                # 服务器端项目(包含API和服务)
├── Shared/                # 共享模型和接口
├── wwwroot/               # 静态资源
├── App.razor              # 根组件
├── MainLayout.razor       # 布局组件
├── _Imports.razor         # 全局导入
├── index.html             # WebAssembly入口
└── Program.cs             # 应用程序入口

七、运行与部署

  1. 开发环境运行

    dotnet run  # 服务器端渲染
    dotnet watch run  # 启用热重载
    
  2. 部署到 IIS / 云服务

    • 发布项目:dotnet publish -c Release
    • WebAssembly 应用可直接部署静态文件;服务器端应用需部署到支持.NET 的服务器(如 Azure App Service)。

核心特性总结

  • 组件化开发:通过.razor文件混合 HTML、C# 和 CSS,实现可复用 UI 组件。
  • 双向绑定:使用@bind语法简化表单交互(如@bind="userName")。
  • 依赖注入:通过[Inject]特性注入服务(如HttpClient、数据库上下文)。
  • 状态管理:使用StateHasChanged()通知组件更新 UI。
  • 跨平台:WebAssembly 版可在浏览器中运行,服务器版可部署到任何支持.NET 的平台。

通过以上示例,可快速入门 C# Blazor 开发,进一步可扩展为复杂的企业级应用。

在 Razor 语法中,输出表达式的方式与传统 ASP/ASPX 有所不同。以下是 <%=now%> 在 Razor 中的等效实现方法:

1. 基本语法对比

技术输出当前时间的代码示例
ASP/ASPX<%= Now() %> 或 <% Response.Write(Now()) %>
Razor (VB.NET)@Now 或 @DateTime.Now

2. Razor 实现示例

在 .cshtml 文件中
<p>当前时间:@Now</p><!-- 等效于 -->
<p>当前时间:@DateTime.Now</p><!-- 格式化输出 -->
<p>格式化时间:@DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")</p>
在代码块中使用
@CodeDim currentTime = DateTime.NowDim formattedTime = currentTime.ToString("yyyy年MM月dd日")
End Code<p>代码块中的时间:@formattedTime</p>

3. 动态表达式与 HTML 编码

Razor 会自动对输出内容进行 HTML 编码,防止 XSS 攻击:

@CodeDim userInput = "<script>alert('XSS');</script>"
End Code<!-- 输出编码后的内容:&lt;script&gt;alert('XSS');&lt;/script&gt; -->
<p>自动编码:@userInput</p><!-- 若需输出原始 HTML(需谨慎!) -->
<p>原始 HTML:@Html.Raw(userInput)</p>

4. 与传统 ASPX 的差异

特性ASPX (<%= %>)Razor (@)
语法简洁度较长,需显式标记开始和结束更简洁,使用 @ 符号
代码块集成使用 <% %> 包裹代码使用 @Code ... End Code
HTML 编码需手动调用 Server.HtmlEncode自动编码,可通过 @Html.Raw 禁用
类型推断弱类型,需显式转换强类型,支持智能感知

5. 复杂表达式示例

<!-- 条件表达式 -->
<p>状态:@If(DateTime.Now.Hour < 12, "上午", "下午")</p><!-- 方法调用 -->
@CodeFunction GetWelcomeMessage() As StringReturn "欢迎访问,当前时间:" & DateTime.Now.ToString()End Function
End Code<p>消息:@GetWelcomeMessage()</p>

6. 在 Blazor 组件中使用

如果是 Blazor 组件(.razor 文件),语法类似,但支持双向绑定和组件生命周期:

<p>当前时间:@CurrentTime</p>
<button @onclick="UpdateTime">刷新时间</button>@CodePrivate CurrentTime As DateTime = DateTime.NowPrivate Sub UpdateTime()CurrentTime = DateTime.NowEnd Sub
End Code

总结 Razor 通过 @ 符号提供了更简洁、安全的表达式输出方式,同时支持强类型和智能感知,是 ASP.NET Core 中推荐的视图语法。对于 VB.NET 用户,@Now 是最直接的 <%=Now%> 替代方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/86100.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/86100.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/86100.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端的安全隐患之API恶意调用

永远不要相信前端传来的数据&#xff0c;对于资深开发者而言&#xff0c;这几乎是一种本能&#xff0c;无需过多解释。然而&#xff0c;初入职场的开发新手可能会感到困惑&#xff1a;为何要对前端传来的数据持有如此不信任的态度&#xff1f;难道人与人之间连基本的信任都不存…

基于 Spark 实现 COS 海量数据处理

上周在组内分享了一下这个主题&#xff0c; 我觉得还是摘出一部分当文章输出出来 分享主要包括三个方面&#xff1a; 1. 项目背景 2.Spark 原理 3. Spark 实战 项目背景 主要是将海量日志进行多维度处理&#xff1b; 项目难点 1、数据量大&#xff08;压缩包数量 6TB,60 亿条数…

Unity3D 屏幕点击特效

实现点击屏幕任意位置播放点击特效。 屏幕点击特效 需求 现有一个需求&#xff0c;点击屏幕任意位置&#xff0c;播放一个点击特效。 美术已经做好了特效&#xff0c;效果如图&#xff1a; 特效容器 首先&#xff0c;画布是 Camera 模式&#xff0c;画布底下有一个 UIClic…

MCU编程

MCU 编程基础&#xff1a;概念、架构与实践 一、什么是 MCU 编程&#xff1f; MCU&#xff08;Microcontroller Unit&#xff0c;微控制器&#xff09; 是将 CPU、内存、外设&#xff08;如 GPIO、UART、ADC&#xff09;集成在单一芯片上的小型计算机系统。MCU 编程即针对这些…

Go语言--语法基础6--基本数据类型--数组类型(1)

Go 语言提供了数组类型的数据结构。 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列&#xff0c;这种类型可以是任意的 原始类型例如整型、字符串或者自定义类型。相对于去声明number0,number1, ..., and number99 的变量&#xff0c;使用数组形式 numbers[0], …

左神算法之给定一个数组arr,返回其中的数值的差值等于k的子数组有多少个

目录 1. 题目2. 解释3. 思路4. 代码5. 总结 1. 题目 给定一个数组arr&#xff0c;返回其中的数值的差值等于k的子数组有多少个 2. 解释 略 3. 思路 直接用hashSet进行存储&#xff0c;查这个值加上k后的值是否在数组中 4. 代码 public class Problem01_SubvalueEqualk {…

自回归(AR)与掩码(MLM)的核心区别:续写还是补全?

自回归(AR)与掩码(MLM)的核心区别:用例子秒懂 一、核心机制对比:像“续写”还是“完形填空”? 维度自回归(Autoregressive)掩码语言模型(Masked LM)核心目标根据已生成的token,预测下一个token(顺序生成)预测句子中被“掩码”的token(补全缺失信息)输入输出输入…

后端开发两个月实习总结

前言 本人目前在一家小公司后端开发实习差不多两个月了&#xff0c;现在准备离职了&#xff0c;就这两个月的实习经历写下这篇文章&#xff0c;既是对自己实习的一个总结&#xff0c;也是给正在找实习的小伙伴以及未来即将进入到后端开发这个行业的同学的分享一下经验。 一、个…

Python基础(​​FAISS​和​​Chroma​)

​​1. 索引与查询性能​ ​​指标​​​​FAISS​​​​Chroma​​​​分析​​​​索引构建速度​​72.4秒&#xff08;5551个文本块&#xff09;91.59秒&#xff08;相同数据集&#xff09;FAISS的底层优化&#xff08;如PQ量化&#xff09;加速索引构建&#xff0c;适合批…

Windows下memcpy_s如何在Linux下使用

Windows下代码如下 memcpy_s(pLine->ppBuf[i], m_ColorLineByte, pIn nOffset, m_ColorLineByte); 方案 1&#xff1a;使用标准 memcpy 手动检查&#xff08;最通用&#xff09; // 检查参数有效性 if (pLine->ppBuf[i] nullptr || pIn nullptr || m_ColorLi…

2025年数学算法与自动化控制国际会议(ICMAAC 2025)

2025年数学算法与自动化控制国际会议&#xff08;ICMAAC 2025&#xff09; 2025 International Conference on Mathematical Algorithms and Automation Control 一、大会信息 会议简称&#xff1a;ICMAAC 2025 大会地点&#xff1a;中国长沙 审稿通知&#xff1a;投稿后2-3日…

C语言数组介绍 -- 一维数组和二维数组的创建、初始化、下标、遍历、存储,C99 变长数组

目录 1. 一维数组 1.1 数组的概念 1.2 一维数组的创建 1.3 一维数组的初始化 1.4 数组的类型 1.5 数组下标 1.5.1 数组元素的遍历 1.5.2 数组的输入 1.6 一维数组在内存中的存储 1.7 sizeof 计算数组元素个数 2. 二维数组 2.1 二维数组的创建 2.2 二维数组的初始…

SpringAI + DeepSeek大模型应用开发 - 进阶篇(上)

三、SpringAI 2. 哄哄模拟器 2.1 提示词工程 提示词工程&#xff08;Prompt Engineering&#xff09;&#xff1a;通过优化提示词&#xff0c;使大模型生成尽可能理想的内容&#xff0c;这一过程就叫提示词工程。 &#xff08;1&#xff09;清晰明确的指令 谈谈人工智能 …

Spring Boot实现异常处理

Spring Boot 提供了多种灵活的方式实现异常处理&#xff0c;以下是核心方案和最佳实践&#xff1a; 一、基础异常处理方案 1. ControllerAdvice ExceptionHandler&#xff08;全局处理&#xff09; ControllerAdvice public class GlobalExceptionHandler {// 处理特定异常&…

【目标检测】IOU的概念与Python实例解析

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

Vue2中如何使用vue-print-nb打印功能

插件官网地址&#xff1a;vue-print-nb - npm 1.安装 npm install vue-print-nb --save 2.导入打印插件 //main.js import Print from vue-print-nb Vue.use(Print); 3.配置参数 4.页面使用 <div id"printDiv">打印内容</div><el-button v-print&…

Matplotlib快速入门

目录 基本使用 解决中文乱码 一个坐标系绘制多个图像 多个坐标系绘制 基本使用 什么是Matplotlib 是专门用于开发2D图表(包括3D图表)以渐进&#xff0c;交互式方式实现数据可视化 为什么要学习matplotlib 可视化是在整个数据挖掘的关键辅助工具&#xff0c;可以清晰的理解…

扣料不允许‘货物移动’

遇到了报错&#xff0c;不允许货物移动 以为又是和之前一样是订单已经关闭&#xff0c;看是领错料还是财务误关的原因&#xff0c;但是co03一看订单状态并没有关闭 原因就是这个CRTD 订单只是创建了&#xff0c;但是没有下达 找个正常的看看&#xff1a; 一般订单创建和下达都…

【AI】全新AI测试系列之二--------AI自动化测试,提高测试效率

目录 一、自动化测试 1、与手动测试对比 2、自动化测试流程 二、自动化测试环境搭建 三、web自动化使用AI的两种方式 1、利用DeepSeek快速生成脚本 2、pycharm集成通义灵码 四、通义灵码实战 1、使用提示词生成代码 2、使用pytest框架 前言&#xff1a;上一章节只要是…

npm包冲突install失败

--legacy-peer-deps是npm&#xff08;Node.js包管理器&#xff09;的一个命令行选项&#xff0c;主要用于解决依赖冲突问题。当安装依赖时&#xff0c;npm默认会严格检查peer dependencies&#xff08;对等依赖&#xff09;的版本兼容性&#xff0c;可能导致安装失败。启用此选…