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 楼
Subtitle
是string
,测试它是否是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")
评论
请查看模板化的委托,以便您可以在相关位置保留标记并将逻辑移至扩展方法。