【问题标题】:Changing the background colour of a given row in a table更改表格中给定行的背景颜色
【发布时间】:2011-11-03 12:10:29
【问题描述】:

我需要根据@Html.CheckBox 中使用的模型(布尔)属性值更改表中给定行的背景颜色。使用 PostExampleCompleted 操作方法中的新复选框值更新模型。

<table>
    <thead>
        <tr>
            <th>Item name</th>
            <th>Comments</th>
            <th>User</th>
            <th>Complete</th>
        </tr>
    </thead>
    <tbody>
        <tr id="FooRow">
            <td>Foo</td>
            <td>@Model.FooComments</td>
            <td>@Model.FooUserName</td>
            <td>
                @using (Ajax.BeginForm("PostFooCompleted", "Home", new AjaxOptions { OnBegin = "ShowProcessingMsg", OnComplete = "HideProcessingMsg" })) 
                {
                    @Html.CheckBox("FooItemComplete", Model.FooComplete, new { onClick = "$(this).parent('form:first').submit();" })
                }
            </td>
        </tr>
        <tr id="WidgetRow">
            <td>Widget</td>
            <td>@Model.WidgetComments</td>
            <td>@Model.WidgetUserName</td>
            @using (Ajax.BeginForm("PostWidgetCompleted", "Home", new AjaxOptions { OnBegin = "ShowProcessingMsg", OnComplete = "HideProcessingMsg" })) 
                {
                    @Html.CheckBox("WidgetItemComplete", Model.WidgetComplete, new { onClick = "$(this).parent('form:first').submit();" })
                }
            </td>
        </tr>
    </tbody>
</table>

实现这一目标的最佳方法是什么?代码示例将不胜感激:)。

谢谢。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-2 jquery


    【解决方案1】:

    鉴于我已经理解您要正确执行的操作,这样的事情应该可以解决问题。

    首先这里是一个 css 类,如果选中了一个复选框,我用它来为一行着色。

    .redBackground
    {
        background-color: Red;
    }
    

    接下来,这里有一些 JQuery 代码,如果选中,则为复选框所在的行着色。我还为每个复选框添加了一个“更改”处理程序,因此如果其中任何一个被更新,则行颜色会相应更新(我刚刚将红色用于选中复选框并且没有颜色的行复选框未选中)。

    <script src="http://code.jquery.com/jquery-latest.js"></script>
        <script type="text/javascript">
    
            $(function () {
    
                $('input[type=checkbox]').each(function () {
    
                    var checkbox = $(this);
    
                    // if the checkbox is already checked, colour its row
                    CheckStatus(checkbox);
    
                    //Every time a check-box status changes we 
                    //want to re-evaluate the row colour
                    checkbox.change(function () {
                        CheckStatus(checkbox);
                    });
    
                });
    
                //Method which checks if the check-box is checked. If it's checked
                //the row is given the 'redBackground' class, otherwise it is taken away
                function CheckStatus(checkbox) {
                    if (checkbox.attr('checked') == 'checked') {
                        checkbox.parent().parent().addClass('redBackground');
                    }
                    else {
                        checkbox.parent().parent().removeClass('redBackground');
                    }
                }
    
            });
    </script>
    

    希望这是有道理的... :)

    【讨论】:

      【解决方案2】:

      代码有点小,无法准确了解您的设置。

      根据您有一个元素的事实,我推断您在一个表中有多行。 就我个人而言,我反对在每一行中都有一个 AjaxForm。这似乎是很多开销。

      您可以很容易地拥有一个 jQuery 代码结构来处理所有行并自行执行必要的任务。

      如果您使用 jQuery 的实时功能,您甚至可以独立于添加的行。

      复选框或行需要有一个标识符,您可以使用该标识符将 ajax 调用发送回您的控制器。成功后,您可以评估复选框的状态并适当地为行着色。

      我必须查看更多代码才能真正帮助您。

      【讨论】:

        【解决方案3】:

        也许我错过了什么。这似乎是 html 或 css 的工作。据我所知,有几种方法可以解决这个问题,具体取决于您的要求。

        在逐行的基础上(即,您永远不会知道颜色是什么,直到它们被应用程序或在数据库中静态存储它们的值不是一个选项定义),分配 html 样式属性@987654322 @ 将background-color 设置为您想要的颜色。

        基于类型/状态(即,您提前知道颜色将是什么,但不知道它们将分配给哪些行),我将为每一行定义一个类:@987654324 @ 然后在你的 CSS 类中分配 background-color 与 Model.Type 中的值同名。

        要获得该颜色/类型本身,您需要使用您的模型传递它。我不知道,您的模型上可能已经有该属性。

        对于简单的交替模式,simply use this technique:nth-child(odd):nth-child(even) css 选择器。

        有时最简单的解决方案就是最好的解决方案。

        【讨论】:

        • 我认为你误解了他的要求......他想根据模型的值设置一行的背景颜色。问题在于 Model 值可以通过 Ajax 调用更改。我不确定 Ajax 表单是否真的改变了 Model 值,而只是在其表单中设置了控件的值。
        • 是的,这是正确的:模型会使用清单值进行更新,但这不是我的主要问题。我可以简单地使用类似的东西:,但是因为没有页面刷新(这很好——我不想要),用户不会看到它。所以我需要一个理想的基于 jQuery 的解决方案。
        • 你可能应该先这样做,这样它就可以不受javascript的影响。然后,一旦成功运行,通过 ajax() 加载值并使用针对相同技术的 JQuery 的 addClass() 函数添加或删除一个类。由于您正在发布数据,我猜您已经知道您对哪一行感兴趣。如果您不直接,我建议您在该行中添加一个 id 以供参考。
        • 要详细说明静默答案,我建议您在 HideProcessingMsg 中添加 jquery 函数以验证复选框值并相应地分配颜色
        猜你喜欢
        相关资源
        最近更新 更多
        热门标签