You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:38:35