Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 如何使用带有Razor和内联代码块的if语句_Asp.net_Asp.net Mvc_Asp.net Mvc 3_Syntax_Razor - Fatal编程技术网

Asp.net 如何使用带有Razor和内联代码块的if语句

Asp.net 如何使用带有Razor和内联代码块的if语句,asp.net,asp.net-mvc,asp.net-mvc-3,syntax,razor,Asp.net,Asp.net Mvc,Asp.net Mvc 3,Syntax,Razor,我正在用新的Razore视图引擎更新旧的.aspx视图。我有很多地方有这样的代码: <span class="vote-up<%= puzzle.UserVote == VoteType.Up ? "-selected" : "" %>">Vote Up</span> 投赞成票 理想情况下,我想这样做: <span class="vote-up@{puzzle.UserVote == VoteType.Up ? "-selected" : ""}"&

我正在用新的Razore视图引擎更新旧的.aspx视图。我有很多地方有这样的代码:

<span class="vote-up<%= puzzle.UserVote == VoteType.Up ? "-selected" : "" %>">Vote Up</span>
投赞成票
理想情况下,我想这样做:

<span class="vote-up@{puzzle.UserVote == VoteType.Up ? "-selected" : ""}">Vote Up</span>
投赞成票
然而,这里有两个问题:

  • vote up@{puzzle.UserVote
    …未将@符号视为代码块的开头
  • @puzzle.UserVote==VoteType.Up
    查看第一部分
    @puzzle.UserVote
    ,就好像它应该呈现变量的值一样
  • 有人知道如何解决这些问题吗?

    这应该可以:

    <span class="vote-up@(puzzle.UserVote == VoteType.Up ? "-selected" : "")">Vote Up</span>
    
    投赞成票
    
    关键是将表达式封装在@delimiter后面的括号中。您可以通过这种方式使任何复合表达式工作。

    在大多数情况下都可以工作得很好。但是我遇到了一个更扭曲的情况:

    @( condition ? "true" : "false" )
    
     @(String.IsNullOrEmpty(Model.MaidenName) ? "&nbsp;" : Model.MaidenName)
    
    这将在我的页面中打印“我”,分别生成源代码
    。现在有一个函数
    Html.Raw(“”
    ),它应该允许您编写源代码,但在这个星座中,它会引发编译器错误:

    编译器错误消息:CS0173:无法指定条件表达式的类型 无法确定,因为之间没有隐式转换 'System.Web.IHtmlString'和'string'

    因此,我最终写了一个如下的声明,虽然不太好,但在我的情况下仍然有效:

    @if (String.IsNullOrEmpty(Model.MaidenName)) { @Html.Raw("&nbsp;") } else { @Model.MaidenName } 
    

    注意:有趣的是,一旦你进入花括号,你必须重新启动剃须刀块。

    我没有使用剃须刀,但根据我看到的情况,尝试
    @(puzzle.UserVote==VoteType.Up?”-选中“:”)
    由于这是razor中内联三元运算符的最高结果,我将补充一点,如果您的输出包含html或可编码字符,如撇号,例如
    @(isSomething?class='test':)
    例如,注入javascript或类似代码,它会将它们编码为实体,如
    ';
    并断开页面。因此必须使用
    Html.Raw(“…”)
    。否则,使用上面的代码,您最终会得到类似于

    的东西,这是无效的。使用paren而不是大括号非常奇怪。如果您需要显示属性的值(包括字符串)而不是调用ToString()的话,我选择了这一个,感觉很干净,而且以后很容易读懂-这在我的情况下不起作用。您可以这样做@(条件?$“{foo.bar}”:“默认”)为什么不干脆
    @(String.IsNullOrEmpty(Model.MaidenName)?Html.Raw(“”:Model.MaidenName)
    Uhm..由于前面提到的编译器错误,怎么样?;)对不起,我需要更多的咖啡:)您可以通过使三元运算符的两边都是相同的类型来避免这个错误,
    @(String.IsNullOrEmpty(Model.MaidenName)?Html.Raw(“”:Html.Raw(Model.MaidenName))