【问题标题】:Using razor code within javascript function在 javascript 函数中使用剃刀代码
【发布时间】:2015-05-21 01:14:39
【问题描述】:

以下是我的观点...您可以看到网格是从视图模型中填充的

 for (int i = 0; i < Model._effGrid.Count; i++)
    {
            <div id="gridRow@(i)" class="row">

                <div class="col-md-1">
                    @Html.CheckBoxFor(m => m._effGrid[i].chkBox, new { id = ("chkGridRow" + i), @unchecked = true })
                    @*<input type="checkbox" id="chkBox@(i)" />*@
                </div>

                <div class="col-md-2">
                    @Html.DropDownListFor(m => m._effGrid[i].iterationId, new SelectList(Model.Iterations, "Value", "Text", Model._effGrid[i].iterationId), new { id = ("drpIteration" + i) })

                </div>
                <div class="col-md-2">
                    @Html.DropDownListFor(m => m._effGrid[i].PhaseID, new SelectList(Model.Phases, "Value", "Text", Model._effGrid[i].PhaseID), new { id = ("drpPhase" + i) })
                </div>

                <div class="col-md-2">
                    @Html.DropDownListFor(m => m._effGrid[i].ActivityID, new SelectList(Model.Activities, "Value", "Text", Model._effGrid[i].ActivityID), new { id = ("drpActivity" + i) })
                </div>
                <div class="col-md-2">
                    @*<input id="dtEffort@(i)" type="date" class="textwidth90percent texthieght10percent" value="@Model._effGrid[i].EffortDate.ToString("yyyy-MM-dd")">*@
                    @*@Html.EditorFor(m => m._effGrid[i].EffortDate)*@
                    @Html.TextBoxFor(m => m._effGrid[i].EffortDate, Model._effGrid[i].EffortDate.ToString("yyyy-MM-dd"), new { type = "date", @class = "textwidth90percent texthieght10percent" })

                </div>

                <div class="col-md-1">
                    @Html.TextBoxFor(m => m._effGrid[i].Hours, new { id = ("hours" + i), @class = "textwidth60percent" })
                </div>

                <div class="col-md-1" style="visibility: hidden">
                    @Html.TextBoxFor(m => m._effGrid[i].effortid)
                </div>

            </div>
        counter = i;
    }
        }

用户可以选择检查 chkboxes 并单击上面的按钮...在 UPON 上,我需要检查已选中的复选框并获取相应的数据以在 ajax 调用中发送。

<script type="text/javascript">
    $(document).ready(function () {
        $("#SaveEffortChanges").click(function (e) {
            debugger;
  @foreach (var item in Model._effGrid)
                {
                    var it = item;


            if (it.chkBox)
                    {
                          UpdateEffortDetail(it.effortid, it.iterationId, it.ActivityID, it.PhaseID, it.EffortDate, it.Hours);
                    } 


                }

            //$("#EffortForm").submit(e.data)
        });
 }
        );

在上面的js函数中UpdateEffortDetail只是一个ajax调用。 我希望现在问题更清楚了,如果您需要进一步的输入,请告诉我。

【问题讨论】:

  • 你究竟要实现什么?有什么特别的输出吗?
  • 我实际上拥有的是一个从视图模型填充的网格,网格中的每一行都会有一个复选框...单击底部的更新按钮,我正在尝试更新与选中的复选框相对应的网格中的编辑数据。我个人发现 razor 语法非常方便,因此可以解释上述方法。如果需要进一步说明,请告诉我
  • 你想要的输出是什么?您想成为客户端的哪些位? item.chkbox 是否适用于任何元素?
  • 在这种情况下,您将无法使用 Razor 模型,因为该模型将在页面加载时用于渲染网格,并且您的要求是处理单击更新按钮后检查的行点击更新按钮,剃须刀型号将不可用。
  • @marcGravell 是的,预计 item.chkbox 将检查一行或多行,基于这些行将触发 ajax 调用。

标签: c# jquery razor model-view-controller


【解决方案1】:

把你的Grid rows放在id为“divGrid”的Div中,这样我们就可以在javascript代码中轻松访问它。

    <script type="text/javascript">
    $(document).ready(function () {
        $("#SaveEffortChanges").click(function (e) {

          $("#divGrid").find('input[type=checkbox]:checked').each(function(){

            var row = $(this).closest('div.row');
            var effortid = row.find('input[name*="effortid"]').val();
            var iterationId = row.find('input[name*="iterationId"]').val();
            var ActivityID = row.find('input[name*="ActivityID"]').val();
            var PhaseID = row.find('input[name*="PhaseID"]').val();;
            var EffortDate = row.find('input[name*="EffortDate"]').val();
            var Hours = row.find('input[name*="Hours"]').val();

            //Use Ajax method to call your Update method on Server side with above updated data
          });

        });
 }
        );

</script>

此脚本将从选中复选框的网格中获取所有行,然后我们在该复选框上循环,找到它的父行。从父行我们找到要更新的数据。

这是获取更新的行数据的方式。

如果你掌握了逻辑,这段代码可以进一步简化。

【讨论】:

  • 通过一些更改,我可以使上面的代码工作..它是唯一实际工作的方法......但你是对的,必须有一个简化的方法。
  • 目前,使用这种方法,您将为每一行调用服务器端方法。我的建议是使用 Form 标签将整个网格数据发布到服务器。在服务器端,您可以轻松检查检查/更新的行,并可以立即处理数据。它也将节省您和服务器的大量时间
【解决方案2】:

这里有两个选项;要么没有元素将 chkbox 设置为 true(在这种情况下,我们不应该期望任何输出),要么 //code 看起来很酷,足以欺骗处理器尝试在服务器端运行它;你可以尝试给它&lt;text&gt; 提示:

@foreach (item in Model.grid)
{
    if (item.chkbox)
    {
        <text>
        //code
        </text>
    }
}

【讨论】:

  • 不,项目未定义 -Js 错误...尝试将项目分配给 var item1,但无济于事,我猜剃须刀在这里是不可见的。
  • @MRK 除非你能在//code 中展示你正在尝试做的事情,否则我们不可能发表比上述更多的评论......你是否可能省略了很多代码可以使if 应该是客户端的事情吗?因为 that 会导致“item is undefined” - 在这种情况下,@if(item.chkbox) - 但是要获得“item is undefined”,您已经获得更多客户端比你在问题中建议的要多
  • 更新了我的问题,请看看是否更有意义。
猜你喜欢
  • 2018-03-01
  • 2016-08-15
  • 2020-03-02
  • 2014-09-04
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 2014-03-09
  • 1970-01-01
相关资源
最近更新 更多