【问题标题】:Passing data (list) from view to controller with TextBox使用 TextBox 将数据(列表)从视图传递到控制器
【发布时间】:2015-06-24 07:57:59
【问题描述】:

我正在使用带有剃须刀的 ASP MVC4,但我坚持将一些信息从我的视图返回到我的控制器,并在一个包含以下元素的列表中...... 我使用 TextBox 能够运行我的 js 函数... 我使用以下 (updatesum()) javascript 在字段中动态计算我认为射手得分的总和:

<td> 
    @Html.TextBox("suma["+@i+"]", Model[i].ArchScore1,  new{ @onchange = "updatesum()"})
    @Html.ValidationMessageFor(x => x[i].ArchScore1)
</td> 
<td>
    @Html.TextBox("sumb["+@i+"]", Model[i].ArchScore2, new { @onchange = "updatesum()" })
    @Html.ValidationMessageFor(x => x[i].ArchScore2)
</td>
<td> 
    @Html.TextBox("sumt["+@i+"]", Model[i].ArchTot`enter code here`alScore, new { @onchange = "updatesum()" })
    @Html.TextBoxFor(x=>x[i].ArchTotalScore)
    @Html.ValidationMessageFor(x => x[i].ArchTotalScore)
</td> 

<script type="text/javascript">
    function updatesum() {
        for (i = 0; i < 15; i++) {
            var sua = "suma_" + i + "_";
            var sub = "sumb_" + i + "_";
            var sut = "sumt_" + i + "_";
            suma = document.getElementById(sua).value;
            sumb = document.getElementById(sub).value;
            sum = (suma - 0) + (sumb - 0);
            document.getElementById(sut).value = sum;
        }   
    }        
</script>

你知道将这个javascript函数的结果添加到TextBoxFor中是否可行吗?

这是我修改后的代码:

<td> 

                    @Html.TextBoxFor(m => m[i].ArchScore1, new{ @class = "score" })
                    @Html.ValidationMessageFor(x => x[i].ArchScore1)
                </td> 
                <td>>
                    @Html.TextBoxFor(m => m[i].ArchScore2, new{ @class = "score" })
                    @Html.ValidationMessageFor(x => x[i].ArchScore2)
                </td>
                <td>
                    @Html.TextBoxFor(m => m[i].ArchTotalScore, new{ @class = "score" })
                    @Html.ValidationMessageFor(x => x[i].ArchTotalScore
                </td> 
            </tr>
        }

    </table>
    <p>
        <input type="submit" value="Save" />
    </p>
}

<script type='text/javascript'> 
              $('.score').change(function () {
                    var inputs = $(this).closest('tr').find('input');
                    inputs.eq(2).val(new Number(inputs.eq(0).val()) + new Number(inputs.eq(1).val()));
                });


</script>

第三个文本框仍未填充。

【问题讨论】:

  • 为什么您创建的控件与您的模型完全没有关系,并且在您提交时永远不会绑定到您的模型! - @Html.TextBox("suma["+@i+"]", Model[i].ArchScore1) 应该是 @Html.TextBoxFor(m =&gt; m[i].ArchScore1)
  • 你到底想计算什么? - 你想要每一行的总数和总计吗?
  • 其实用户在score 1和score 2中输入了一个数字,自动计算出2的和并填入Total。
  • 但是每行有 4 个文本框(在第 3 列中有 2 个文本框)对吗?你也想要一个总数吗?
  • 正确。但是这个想法

标签: javascript asp.net asp.net-mvc asp.net-mvc-4 razor


【解决方案1】:

您可以使用以下脚本来更新行小计。给文本框一个类名(比如class="score"

$('.score').change(function() {
  var inputs = $(this).closest('tr').find('input');
  inputs.eq(2).val(new Number(inputs.eq(0).val()) + new Number(inputs.eq(1).val()));
});

但是您的代码中还有多个其他错误。首先,您手动覆盖输入的名称,因此当您发布时它不会绑定到您的模型。您需要更换

@Html.TextBox("suma["+@i+"]", Model[i].ArchScore1)

@Html.TextBoxFor(m => m[i].ArchScore1, new { @class = "score" })

其他文本框也是如此

您的总计文本框不应该是文本框(或者如果是,那么它们应该被禁用),因此它们不会回发。如果您需要保存计算,必须在提交时在服务器上再次进行计算

【讨论】:

  • 感谢您的帮助。但是,我真的不知道如何将此 jquery 脚本集成到我的代码中......
  • 哪一部分你不明白?只需删除您现有的 function updatesum() { ... } 脚​​本并将其替换为我的答案中的脚本即可。如果它位于页面底部(紧接在关闭 &lt;/body&gt; 标记之前,那么它可以正常工作。如果不是,那么您需要将其包裹在 $(document).ready()
  • 我还创建了this fiddle 来向您展示它是如何工作的
  • 谢谢。我实际上用你的脚本替换了我的 updatesum() 脚本。我将脚本放在 _layout.cshtml 页面底部的
猜你喜欢
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
相关资源
最近更新 更多