我正在尝试执行以下操作
<div id="test">
@(
string.IsNullOrEmpty(myString)
? @:
: myString
)
</div>
上面的语法无效,我尝试了很多不同的东西,但无法让它发挥作用。
答案 0 :(得分:51)
尝试以下方法:
@Html.Raw(string.IsNullOrEmpty(myString) ? " " : Html.Encode(myString))
但是我会建议你写一个帮助你完成这项工作,这样你就不必把意见变成意大利面了:
public static class HtmlExtensions
{
public static IHtmlString ValueOrSpace(this HtmlHelper html, string value)
{
if (string.IsNullOrEmpty(value))
{
return new HtmlString(" ");
}
return new HtmlString(html.Encode(value));
}
}
然后在您的视图中简单地说:
@Html.ValueOrSpace(myString)
答案 1 :(得分:1)
你可以这样做:
@{
Func<dynamic, object> a = (true ?
(Func<dynamic, object>)(@<text> Works1 </text>)
: (Func<dynamic, object>)(@<text> Works2 </text>));
@a(new object());
}
或者将其设为内联:
@(
((Func<dynamic, object>)(true == false
? (Func<dynamic, object>)(@<text> Works2 </text>)
: (Func<dynamic, object>)(@<text> Works3 </text>)))
(new object())
)
(请注意,以上所有内容也适用于一行,为了清晰起见,我将它们分开了)
然而,OP的初衷可以修改为可行,但必须保留此时间换行符:
@(((Func<dynamic, object>)( true == true ? (Func<dynamic,object>)(@: Works
): (Func<dynamic, object>)(@: Not Works
)))("").ToString())
注意强>
实际上你只需要在操作符中的一个选项上进行强制转换,而且你也不必将动态作为Func的第一个选项,你可以给出任何东西,并且在评估你时也是如此只要它与Func的第一个参数匹配就可以给出任何东西。
例如,您可以执行以下操作(我认为这是最短的版本):
@(
((Func<int, object>)(true == false
? (Func<int, object>)(@<text> Works2 </text>)
: @<text></text>))
(0)
)
如果你经常使用它,那么在
中继承Func是个好主意public class Razor : Func<dynamic, object>{}
或者甚至可以编写一个包装器方法(甚至是一个lambda表达式,在这种情况下[我不确定但可能]使用常规三元运算符并将转换推迟到被调用者)为三元运算符。
答案 2 :(得分:0)
由于有了新功能,另一种更新的方法是在视图中创建一个辅助函数。这具有使语法更简洁的优点,尤其是在您要多次调用它的情况下。这对于跨站点脚本攻击也很安全,无需调用@ Html.Encode(),因为它不依赖于@ Html.Raw()。
只需在顶部的视图中添加以下内容即可:
@helper NbspIfEmpty(string value) {
if (string.IsNullOrEmpty(value)) {
@:
} else {
@value
}
}
然后您可以使用如下功能:
<div id="test">
@NbspIfEmpty(myString)
</div>
答案 3 :(得分:-1)
@(string.IsNullOrEmpty(myString)? ": ": myString)