Razor三元表达式中的Html字面值

时间:2011-07-28 10:05:13

标签: html asp.net-mvc-3 razor ternary-operator

我正在尝试执行以下操作

<div id="test">
    @(
        string.IsNullOrEmpty(myString)
          ? @:&nbsp;
          : myString   
    )
</div>

上面的语法无效,我尝试了很多不同的东西,但无法让它发挥作用。

4 个答案:

答案 0 :(得分:51)

尝试以下方法:

@Html.Raw(string.IsNullOrEmpty(myString) ? "&nbsp;" : Html.Encode(myString))

但是我会建议你写一个帮助你完成这项工作,这样你就不必把意见变成意大利面了:

public static class HtmlExtensions
{
    public static IHtmlString ValueOrSpace(this HtmlHelper html, string value)
    {
        if (string.IsNullOrEmpty(value))
        {
            return new HtmlString("&nbsp;");
        }
        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)) {
    @:&nbsp;
  } else {
    @value
  }
}

然后您可以使用如下功能:

<div id="test">
    @NbspIfEmpty(myString)
</div>

答案 3 :(得分:-1)

@(string.IsNullOrEmpty(myString)? ":&nbsp;": myString)