第X讲:C# 条件逻辑实战:从if else到Razor页面中的智能决策(黄菊华NET网站开发、C#网站开发、Razor网站开发教程)
1. 从控制台到网页:if else的华丽转身
第一次接触C#的if else语句时,我还在用控制台程序判断奇偶数。那时候觉得,这不就是个简单的判断题吗?直到开始用ASP.NET Core开发网站后台管理系统,才发现条件逻辑简直是动态网页的灵魂。想象一下:用户提交订单后,页面上要显示"待付款"的红色标签;管理员审核内容时,需要看到"已通过"的绿色标记——这些看似简单的界面变化,背后全是if else在撑腰。
在Razor页面中写条件语句,和控制台编程最大的区别就是执行环境。控制台的if else直接输出文本,而Razor中的条件逻辑要决定:
- 某段HTML要不要渲染
- CSS类名该用danger还是success
- 按钮是显示"提交审核"还是"重新编辑"
比如这个订单状态判断的典型场景:
@if (order.Status == OrderStatus.Pending) { <span class="badge bg-warning">待处理</span> } else if (order.Status == OrderStatus.Shipped) { <span class="badge bg-success">已发货</span> } else { <span class="badge bg-secondary">已取消</span> }2. Razor页面中的条件渲染实战
2.1 动态UI组件控制
上周我接手一个内容管理系统,产品经理要求:当文章阅读量超过1万时显示"爆文"标志,同时置顶按钮要高亮。用Razor的条件渲染,三行代码就搞定了:
<div class="article-toolbar"> @if (article.ViewCount > 10000) { <span class="hot-flag">🔥 爆文</span> } <button class="btn-pin @(article.IsPinned ? "active" : "")"> 置顶 </button> </div>这里用到了两种条件渲染方式:
- 元素级控制:整个
<span>标签的显隐由if决定 - 属性级控制:通过三元运算符动态切换CSS类
2.2 多条件组合判断
后台管理系统经常需要复杂权限判断。比如只有管理员+文章未发布时,才显示审核按钮:
@if (User.IsInRole("Admin") && !article.IsPublished) { <button class="btn-approve">审核发布</button> } else if (article.IsPublished) { <span>已发布于@article.PublishDate.ToString("yyyy-MM-dd")</span> }注意:Razor中的逻辑运算符(&&, ||)和C#完全一致,但HTML标签会让代码看起来更复杂。建议超过3个条件时就抽成方法:
@functions { bool ShouldShowApproveButton(Article article) { return User.IsInRole("Admin") && !article.IsPublished && article.Content.Length > 100; } }3. 模型驱动的条件逻辑设计
3.1 状态模式替代复杂if else
在开发订单流转功能时,我最初写出了这样的"面条代码":
@if (order.Status == OrderStatus.New) { <!-- 新订单UI --> } else if (order.Status == OrderStatus.Paid) { <!-- 已支付UI --> } // 还有5个else if...后来改用状态模式,将条件判断封装在模型里:
// 在Order模型中 public string GetStatusBadge() { return Status switch { OrderStatus.New => "badge-secondary", OrderStatus.Paid => "badge-primary", OrderStatus.Shipped => "badge-success", _ => "badge-light" }; } // Razor页面简化为 <span class="badge @order.GetStatusBadge()">@order.Status</span>3.2 视图模型封装业务规则
用户权限判断是最容易让Razor页面变脏的逻辑。比如这个反例:
@if (User.IsInRole("Finance") && DateTime.Now.Day > 15 && invoice.TotalAmount > 10000) { <!-- 显示财务审核UI --> }应该把这些规则移到视图模型:
public class InvoiceViewModel { public bool ShouldShowAuditButton { get; set; } public InvoiceViewModel(Invoice invoice, IPrincipal user) { ShouldShowAuditButton = user.IsInRole("Finance") && DateTime.Now.Day > 15 && invoice.TotalAmount > 10000; } }4. 调试与性能优化技巧
4.1 条件断点设置
在Visual Studio调试Razor页面时,我经常对条件语句设条件断点。比如只当article.IsPublished为false时中断:
- 在if语句行号处右键
- 选择"条件断点"
- 输入
article.IsPublished == false - 勾选"条件表达式"
4.2 避免过度渲染
Razor引擎会完整执行所有if else分支的判断,即使某些分支不会渲染。对于计算量大的条件,可以用延迟加载:
@{ var expensiveData = await LazyLoadDataAsync(); } @if (showDetails && expensiveData != null) { <!-- 显示详情 --> }4.3 条件语句的性能对比
| 条件类型 | 示例 | 适用场景 | 性能影响 |
|---|---|---|---|
| 简单布尔判断 | if (isActive) | 高频渲染元素 | 可忽略 |
| 字符串比较 | if (status == "Success") | 状态显示 | 较小 |
| 集合运算 | if (list.Any()) | 列表渲染 | 中等 |
| 数据库查询 | if (await HasPermission()) | 权限控制 | 较大 |
我在电商后台优化时,把权限查询从Razor移到了PageModel的OnGetAsync中,页面加载时间直接从800ms降到了120ms。
