假设以下模型:

 public class ViewBookModel
{
    public string Title { get; set; }
    public string Subtitle { get; set; }
}
 


我目前正在Razor中像这样渲染它视图:

 <h1>@Model.Title</h1>
@if (Model.Subtitle != null)
{ 
    <h2>@Model.Subtitle</h2>
}
 


我的问题是关于Subtitle位的。上面的方法有点笨拙,有时可能会重复出现(这可能是一个不好的信号)。

是否有更好,更简洁,更优雅的方法来处理这种情况?


我考虑了(a)Mat's Mug的答案中现在提到的选项,以及(b)将条件移至模型:

 public class ViewBookModel 
{
    // ...
    public string ShowSubtitle { 
        get { return string.IsNullOrEmpty(Subtitle); } 
    }
}
 


此视图的更改如下:

@if (Model.ShowSubtitle)


但是,事实并非如此。解决了我的主要问题:详细程度(即仅显示4行代码以显示Subtitle)。

评论

请查看模板化的委托,以便您可以在相关位置保留标记并将逻辑移至扩展方法。

#1 楼

如果您发现某个模式变得过于重复,可以使用@helper代替:

@helper ShowIfNotNull(string header) {
    @if (!string.IsNullOrEmpty(header))
        @:<h2>header</h2>
    }
}

<h1>@Model.Title</h1>
@ShowIfNotNull(Model.Subtitle)


评论


\ $ \ begingroup \ $
以前从未听说过@helper,这非常有用。
\ $ \ endgroup \ $
– Jeroen Vannevel
2014年5月29日17:00

\ $ \ begingroup \ $
欢迎使用代码审查!不错的第一篇文章,希望您继续阅读!随时在Code Review Chat中与常客见面:)
\ $ \ endgroup \ $
– Mathieu Guindon♦
2014年5月29日在17:02

\ $ \ begingroup \ $
再次感谢。经过语法上的一些调整(我建议将其作为编辑),这对我有用。我还添加了一个作为HtmlHelper扩展公开的版本,该版本允许您选择包装标签。
\ $ \ endgroup \ $
– Jeroen
2014年7月6日在9:40

\ $ \ begingroup \ $
@EricB:A,我的编辑被拒绝为“过于激进”。我想很公平,但是,如果您同意我的建议,可以将其合并到您的建议中,我会很乐意再次将我的“接受”标记更改为您的答案,然后删除我的建议。
\ $ \ endgroup \ $
– Jeroen
2014年7月6日15:15

\ $ \ begingroup \ $
如果您要使用此辅助方法,请至少将其命名为ShowIfNotNullOrEmpty,以便它按其说明的样子进行操作...但是,我不建议您使用它:更多代码并将标记移出上下文(您会必须来回切换以了解呈现的标记)。
\ $ \ endgroup \ $
–罗纳德
18年3月13日在8:25

#2 楼

要提供替代解决方案:您可以使用:empty选择器对纯CSS3进行此操作。

 h2:empty {
  display: none
}
 


:empty选择器将匹配所有空标签。 “空”可以包含HTML注释,但不能包含空格。

这里有更详细的说明。

评论


\ $ \ begingroup \ $
Outtathebox,+ 1!使用适当的选择器,它可能会起作用,并且在我的几种情况上在语义上都是“正确的”。
\ $ \ endgroup \ $
– Jeroen
2014年5月30日16:25



\ $ \ begingroup \ $
您能否将外部链接的更多说明添加到您的答案中,那样,如果链接丢失,信息仍在答案中
\ $ \ endgroup \ $
–马拉奇♦
2014年5月30日下午16:41

#3 楼

Subtitlestring,测试它是否是null的一种更优雅的方法是使用string.IsNullOrEmpty(Model.Subtitle),就像这样:

<h1>@Model.Title</h1>
@if (!string.IsNullOrEmpty(Model.Subtitle))
{ 
    <h2>@Model.Subtitle</h2>
}


评论


\ $ \ begingroup \ $
感谢您的评论!我已经考虑了这一点(我想我的问题中应该有一个“我已经尝试过”的部分;但是作为一个答案,它可能会同样帮助未来的访问者)。但是,我主要担心的是冗长,正如埃里克·B(Eric B)的回答所述。
\ $ \ endgroup \ $
– Jeroen
2014年5月29日在18:07

\ $ \ begingroup \ $
太好了!随意给@EricB赢得一个好记号:)
\ $ \ endgroup \ $
– Mathieu Guindon♦
2014年5月29日在18:24

#4 楼

我的答案原本是对@EricB帖子的修改,但该修改被mod拒绝,表明它更适合作为竞争性答案。如果此答案对您有帮助,请考虑对(upvoting;))他的回答做出回应。


如果发现重复的模式过于重复,可以使用@helper代替:

@helper ShowIfNotNull(string header) {
    if (!string.IsNullOrEmpty(header)) {
        <h2>@header</h2>
    }
}


并像这样使用它:

 <h1>@Model.Title</h1>
@ShowIfNotNull(Model.Subtitle)
 


或者,您可以创建一个HtmlHelper扩展程序,该扩展程序执行相同的操作:

public static class StringExtensions
{
    public static IHtmlString ShowIfNotNull(this HtmlHelper htmlHelper, string text, string tagName)
    {
        var builder = new TagBuilder(tagName);
        builder.SetInnerText(text);
        return new HtmlString(builder.ToString());
    }
}


可以这样称呼:

@Html.ShowIfNotNull(Model.Subtitle, "h2")