咨询C# Razor中为标题添加多条件@if判断的最优语法
优雅解决Razor中标题的条件显示问题
嘿,你完全不用在标题的@if里写一大串重复的||判断,这里有几个更干净、易维护的方案:
方案1:提前计算可见状态变量
在Razor代码块里先把所有子项的显示条件整合到一个变量中,之后标题的判断直接复用这个变量,避免重复写一堆条件:
@{ // 把所有li的显示条件整合到一个变量里 bool hasVisibleItems = Ms.Cs.value1 != null || Ms.Cs.value2 != 0 || true // 对应第三个li的固定显示条件 || Ms.Cs.value4 != 0 || Ms.Cs.value5 != null; } @if (hasVisibleItems) { <div class="class"> <h5>MySuperTitle</h5> <ul> @if (Ms.Cs.value1 != null) { <li> My Li1 <span>@Ms.Cs.value1</span> </li> } @if (Ms.Cs.value2 != 0) { <li> My Li2 <span>@Ms.Cs.value2</span> </li> } @if (true) { <li> My Li3 <span>--</span></li> } @if (Ms.Cs.value4 != 0) { <li> My Li4 <span>@Ms.Cs.value4</span></li> } @if (Ms.Cs.value5 != null) { <li> My Li5 <span>@Ms.Cs.value5</span></li> } </ul> </div> }
方案2:收集可见子项到列表(推荐,完全避免重复判断)
这种方式会先把符合条件的列表项收集到一个列表中,最后通过判断列表是否为空来决定是否显示标题和整个区块,彻底杜绝重复的条件判断:
@{ var visibleListItems = new List<IHtmlContent>(); // 逐个判断并添加符合条件的li if (Ms.Cs.value1 != null) { visibleListItems.Add(BuildListItem("My Li1", Ms.Cs.value1)); } if (Ms.Cs.value2 != 0) { visibleListItems.Add(BuildListItem("My Li2", Ms.Cs.value2.ToString())); } if (true) { visibleListItems.Add(BuildListItem("My Li3", "--")); } if (Ms.Cs.value4 != 0) { visibleListItems.Add(BuildListItem("My Li4", Ms.Cs.value4.ToString())); } if (Ms.Cs.value5 != null) { visibleListItems.Add(BuildListItem("My Li5", Ms.Cs.value5)); } // 封装生成li的辅助方法 IHtmlContent BuildListItem(string text, string value) { var li = new TagBuilder("li"); li.InnerHtml.AppendHtml(text); var span = new TagBuilder("span"); span.InnerHtml.Append(value); li.InnerHtml.AppendHtml(span); return li; } } @if (visibleListItems.Any()) { <div class="class"> <h5>MySuperTitle</h5> <ul> @foreach (var item in visibleListItems) { @item } </ul> </div> }
方案3:把判断逻辑移到ViewModel(最佳实践)
如果你的项目遵循MVC模式,建议把这种判断逻辑从视图中分离出来,放到ViewModel里,让视图只负责展示内容,更符合分层设计的原则:
在ViewModel中添加属性:
public class YourViewModel { // 你的现有属性,比如 public CsModel Cs { get; set; } public bool HasVisibleItems => Cs.value1 != null || Cs.value2 != 0 || true // 对应第三个li的条件 || Cs.value4 != 0 || Cs.value5 != null; }
在Razor视图中使用:
@model YourViewModel @if (Model.HasVisibleItems) { <div class="class"> <h5>MySuperTitle</h5> <ul> <!-- 你的li代码保持不变 --> </ul> </div> }
小提醒:
你当前代码中第三个li的条件是@if(true),这意味着这个li永远会显示,标题自然也会一直显示。如果这不是你想要的效果,记得调整这个li的判断条件,这样标题才会有隐藏的可能。
内容的提问来源于stack exchange,提问作者Johan
相关产品推荐
相关产品推荐

