【问题标题】:Conditional element class outputs "class"条件元素类输出“类”
【发布时间】:2018-05-12 16:59:42
【问题描述】:

我正在迭代模型的 cmets(Comment 对象的集合),并且需要根据属性 Privatetrue 还是 false 来设置它们的样式。

我尝试基于这样的属性添加一个类:

<div class="contact-card comment_p_@(comment.Private)">

但是生成的html一直给我

<div class="contact-card comment_p_class">

即使我在这个元素的正下方

<p>@comment.Private</p>

根据需要输出&lt;p&gt;True&lt;/p&gt;&lt;p&gt;False&lt;/p&gt;

这是完整的循环:

@foreach (var comment in comments)
{
    <div class="contact-card comment_p_@comment.Private">
        <strong>@comment.UserName</strong>
        <p>@comment.Private</p>
        <strong class="pull-right">@comment.DateTime</strong>
        <p style="white-space: pre-wrap;">@comment.Content</p>
    </div>
}

以及一次迭代的输出:

<div class="contact-card comment_p_class">
    <strong>skotze</strong>
    <p>True</p>
    <strong class="pull-right">29/11/2017 03:18:12</strong>
    <p style="white-space: pre-wrap;">asda123</p>
</div>

我也试过了

<div class="contact-card comment_p_@comment.Private">
<div class="@comment.Private">
<div class="comment-@comment.Private">

但我总是得到相同的结果...当我尝试使用该属性设置类时,输出 html 将其更改为仅class,即使我能够在它只是在一个时打印真实值&lt;p&gt;.

这是怎么回事?

【问题讨论】:

    标签: c# html asp.net-mvc


    【解决方案1】:

    为了解释这种行为,razor-2 中有两种“条件属性”。

    对于需要string 值的属性,例如class="someValue",那么当您使用时

    @{
        string classname = "myclass";
        string noclass = null;
    }
    <div class="@classname">xx</div>
    <div class="@noclass">xx</div>
    

    那么输出会是

    <div class="myclass">xx</div>
    <div>xx</div>
    

    当属性值为null时,省略属性,否则生成属性值为属性的属性。

    另一种用于boolean属性,比如生成checked="checked"属性。

    当你使用

    @{
        bool checked = true;
        bool notchecked = false;
    }
    <input type="checkbox" checked="@checked" />
    <input type="checkbox" checked="@notchecked" />
    

    那么输出会是

    <input type="checkbox" checked="@checked" />
    <input type="checkbox" />
    

    当属性的值为true时,它会添加与属性名称相同值的属性——即checked="checked",当值为false时,它会省略该属性。

    在您的情况下,属性是bool,其值为true,因此剃刀引擎生成与属性同名的值 - 即"class",并将其附加到现有值和结果是

    <div class="contact-card comment_p_class">
    

    如果属性的值是false,它会生成只是

    <div class="contact-card comment_p_">
    

    如您的自我回答中所述,有必要使用

    <div class="contact-card @(comment.Private ? "comment-priv" : "comment-pub" )">
    

    或类似的条件代码来生成class 属性。

    【讨论】:

    • 谢谢斯蒂芬,是的,我确实注意到 comment_p_ 生成了一个 False 值,所以这很有意义
    【解决方案2】:

    我通过复制 this answer 设法解决了这个问题:

    <div class="contact-card @(@comment.Private ? "comment-priv" : "comment-pub" )">
    

    但是根据this answer,我最初的尝试应该可行。

    如果有人能解释为什么会这样,我会接受他们的回答。

    【讨论】:

    • 我认为您误解了 Razor-2 条件属性的工作原理(您提供的第二个链接与您的情况无关)
    猜你喜欢
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 2019-10-04
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    相关资源
    最近更新 更多