【问题标题】:how can I sum selected checkbox(s) row values?如何对选定的复选框行值求和?
【发布时间】:2012-08-15 07:57:25
【问题描述】:

我在 asp.net mvc 中有一张桌子。在这张表中,每一行都有一个复选框。当我选中一个复选框时,我想在该行中找到工资值并与选中的其他行工资相加。 我想通过 Jquery 或 java 脚本来做这个总和。

    @foreach (var item in Model)
 {
        <tr id="rowid">
            <td>
                <input type="checkbox" name="chk-@intCount" id="chk-@intCount" class="chkclass" />
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Name)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.TechnicalNo)
            </td>
            <td class="sum" id="wagein">
                @Html.DisplayFor(modelItem => item.Wage)
            </td>
            <td class="sum" id="time">
                @Html.DisplayFor(modelItem => item.Time)
            </td>
        </tr>
 }

这是我在 asp.net mvc 中的代码。我现在如何对工资和时间的检查值求和?

编辑:

我的 jQuery 代码:

<script src="/Scripts/jquery-1.4.4.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function () {
$('.chkclass').click(function() {
        var sum = 0;
        $('.chkclass:checked').each(function() {
            sum += parseFloat($(this).closest('tr').find('.wagein').text());    
        });
        $('#sum').html(sum);
    });​
    });
</script>

我的html代码:

<tr>
    <td>
         <input type="checkbox" name="chk-1" id="chk-1" class="chkclass" />
    </td>
    <td class="sum wagein">
        10
    </td>
</tr>
<tr>
    <td>
        <input type="checkbox" name="chk-2" id="chk-2" class="chkclass" />
    </td>
    <td class="sum wagein">
        10
    </td>
</tr>

有什么想法吗?!有什么问题?!

【问题讨论】:

  • 您使用的是 非常 旧版本的 jquery - 考虑升级吗?应该大部分向后兼容!
  • 此处显示的标记与 jquery 代码的组合可以正常工作。检查这个小提琴:jsfiddle.net/ADE3a - 唯一的区别是我将总数输出到一个新的 div,ID 为 total 放在桌子下方。
  • @Jamiec :我将它升级到 1.8.0 。你的 jsfiddle 演示不起作用。但对于达林的作品。
  • 你必须停止说“不工作”。它怎么不工作?你有错误吗?总和没有出现吗?无论如何它对我来说效果很好 - 你使用的是什么浏览器?
  • @Persian.,在您的脚本中的 HTML 中有一个 });?。这是紧跟在$('#sum').html(sum); 之后的行上的无效javascript。去掉这个问号。

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


【解决方案1】:

首先修复您的标记,因为它已严重损坏。请记住,整个 HTML 文档中的 id 必须是唯一的:

@foreach (var item in Model)
{
    <tr>
        <td>
            <input type="checkbox" name="chk-@intCount" id="chk-@intCount" class="chkclass" />
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Name)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.TechnicalNo)
        </td>
        <td class="sum wagein">
            @Html.DisplayFor(modelItem => item.Wage)
        </td>
        <td class="sum">
            @Html.DisplayFor(modelItem => item.Time)
        </td>
    </tr>
}

然后您可以订阅复选框的.click() 事件并为所有工资累积总和:

$(function() {
    $('.chkclass').click(function() {
        var sum = 0;
        $('.chkclass:checked').each(function() {
            sum += parseFloat($(this).closest('tr').find('.wagein').text());
        });
        alert(sum);
    });
​});

这里有一个现场演示,可以看到它的实际效果:http://jsfiddle.net/pbkjr/

【讨论】:

  • 它不工作。就好像你什么都没对我说一样。定义不起作用。因为这对我来说非常有效,正如您在此现场演示中看到的那样:jsfiddle.net/pbkjr Not working 是不知道或不关心程序如何工作的用户常用的一句话。另一方面,寻求帮助的开发人员必须更详细地解释这一点。他们有错误吗?您是否咨询过您的 javascript 调试工具控制台? ...
  • 是的,它适用于您的演示。但我不知道为什么它对我不起作用。我在我的页面中粘贴了您的代码。但还不行。问题是什么 ?! :|
  • 如果不显示您的代码,我到底应该怎么知道为什么您的代码不起作用?你可能犯了一个错误。我无法知道这一点,因为我无法读懂你的想法。是否愿意显示您的视图呈现的 HTML 标记?
  • 我需要看到浏览器看到的呈现的 HTML 标记,而不是你的 Razor 代码。
  • 不,那只是一个表格行。请显示您的浏览器所看到的完整 HTML。右键单击浏览器 => 选择查看页面源代码。然后全选,复制到剪贴板并粘贴到这里,这样我就可以看到你的实际代码了。
【解决方案2】:

好的,从你显示的标记开始,用&lt;table&gt;&lt;/table&gt;标签正确包装,下面有一个div来显示总数:

<table>
<tr>
    <td>
         <input type="checkbox" name="chk-1" id="chk-1" class="chkclass" />
    </td>
    <td class="sum wagein">
        10
    </td>
</tr>
<tr>
    <td>
        <input type="checkbox" name="chk-2" id="chk-2" class="chkclass" />
    </td>
    <td class="sum wagein">
        10
    </td>
</tr>
</table>
<div id="total"></div>

当单击任何复选框时,以下 jquery(@Darin 编写)将汇总所有选中的行:

$('.chkclass').click(function() {
        var sum = 0;
        $('.chkclass:checked').each(function() {
            sum += parseFloat($(this).closest('tr').find('.wagein').text());    
        });
        $('#total').html(sum);
    });

这和 Darin 的原文非常接近,只是我把最后一行改成将总数输出到 id 为 total 的 div 中。这似乎比将总和写入每一行更有可能!

这可以在这个实时示例中看到:http://jsfiddle.net/ADE3a/

【讨论】:

  • 你不觉得你的回答有点像吗?两次发布相同的答案有什么意义?
  • 是的,我愿意。 完全是 OP 编写的代码,有 1 处小改动。有时人们只需要确认他们在正确的轨道上,这可能会提示 OP 他们在哪里犯了错误。 Beats 喋喋不休地谈论他们没有发布他们的标记!
  • 不,不是 OP 编写的代码。他在他的问题中复制的代码我写的,而您在答案中复制了!如果您查看 OP 发布的原始问题,则没有任何 javascript 痕迹。
  • 抱歉,我没有将编辑历史与分钟数进行比较。我的道歉,我会更新这个问题,以正确地给你 5 行 jquery 的功劳。
  • @Jamiec:您的 jsfiddle 演示无法运行 Jamic。但对于达林的作品。
【解决方案3】:

jQuery(document).ready(function ($) {
    var sum = 0;
    $('input[type=checkbox]').click(function () {
        sum = 0;
        $('input[type=checkbox]:checked').each(function () {
            sum += parseFloat($(this).closest('div').find('.payment').val());
        });
        $('#total').val(sum);
    });
});

达林·季米特洛夫

非常感谢。我遇到了一个问题,我想为选中的复选框添加隐藏字段并将复选框值(true 或 false)传递给控制器​​。

@Html.CheckBoxFor 正在为每个复选框在其旁边创建一个隐藏字段

我正在使用 $(this).next().val() 这给了我 NAN 问题。因为它正在获取隐藏字段的值。

感谢您的帖子,我能够获得下一个 div 隐藏字段值

我做了类似下面的事情

【讨论】:

  • 欢迎来到stackoverflow。除了您提供的答案之外,请考虑总结一下为什么这可以解决问题。
猜你喜欢
  • 1970-01-01
  • 2015-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-13
  • 2012-08-17
  • 1970-01-01
相关资源
最近更新 更多