【问题标题】:C# MVC Textbox on the specific table row (disable) when the button is clicked单击按钮时,特定表格行上的 C# MVC 文本框(禁用)
【发布时间】:2018-10-04 19:47:52
【问题描述】:

我有一个表,它的值与我的产品列表循环,我有一个用于“数量”的文本框和一个用于“添加到购物车”的按钮。当我单击“添加到购物车”按钮时,我正在尝试执行此操作,它会检查数量值是否有值,然后仅针对该特定行禁用“数量”文本框。

Product.cshtml

<table id ="productList" class="table table-dark">
    <tr>
        <th>Product ID</th>
        <th>Title</th>
        <th>Description</th>
        <th>Quantity</th>
        <th>Add to cart</th>
    </tr>
    @foreach (var item in Model)
        {
            <tr class="active">
                <td>@item.Id</td>
                <td>@item.Title</td>
                <td>@item.Description</td>
                <td>@Html.TextBox("Quantity", "0", new { @class = "form-control" })</td>
                <td><button class="btn btn-default pull-left" onclick="disableText(Quantity);" id="btn-addToCart">Add To Cart</button></td>
            </tr>
        }
</table>

javascript

function disableText(QtyVal) {
    if(QtyVal.value == '')
    {
        document.getElementById("Quantity").value = 1;
    }
}

目前我的项目的输出是每次我点击任何提交按钮时,它总是会更新第一行(这是不正确的)。

目标是更新数量并为该特定行禁用它

【问题讨论】:

  • 您的 HTML 无效。 id="btn-addToCart" 将重复的 ID 插入到表的每一行中。 HTML id 属性在页面上必须是唯一的。 developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/id
  • 嗨@MarkSchultheiss,谢谢你。如何将唯一 id 传递给按钮本身?在 btn-addToCart[i] 之后添加一个整数?我说的对吗?
  • 我发布了一个答案,应该显示如何使用每行上的按钮,而不需要 id,而是使用类。

标签: javascript c# jquery asp.net-mvc


【解决方案1】:

你的问题在于这个按钮定义:

<button class="btn btn-default pull-left" onclick="disableText(Quantity);" id="btn-addToCart">Add To Cart</button>

foreach 循环会为所有按钮生成重复的 id 属性值,这会构建无效的 HTML 并导致不良行为。由于您的表还包含&lt;input&gt; 标签,您应该使用for 循环而不是foreach 并将不同的类名放在按钮上,例如buttonadd:

<!-- assumed that @model List<Product> is used -->
<table id ="productList" class="table table-dark">
    <tr>
        <th>Product ID</th>
        <th>Title</th>
        <th>Description</th>
        <th>Quantity</th>
        <th>Add to cart</th>
    </tr>
    @for (int i = 0; i < Model.Count; i++)
    {
       <tr class="active">
           <td>@Model[i].Id</td>
           <td>@Model[i].Title</td>
           <td>@Model[i].Description</td>
           <td>@Html.TextBox("Quantity", "0", new { @class = "form-control" })</td>
           <td><button type="button" class="btn btn-default pull-left buttonadd">Add To Cart</button></td>
       </tr>
    }
</table>

然后您可以引用buttonadd 类作为选择器来找出按钮包含哪一行,并将&lt;input&gt; 状态设置为readonly(不是disabled,因为您想在表单提交时发送数量值;所有输入disabled 属性在提交期间不包括在内)如下例所示:

$(document).on('click', '#productList .buttonadd', function () {
    var row = $(this).closest('tr');

    // find quantity text box in the same row as clicked button
    var qty = row.find('input');

    // set quantity value and prevent user input
    qty.val(parseInt(qty.val()) + 1);
    qty.attr('readonly', 'readonly');
});

注意:如果要使用强类型助手,请使用@Html.TextBoxFor

@Html.TextBoxFor(m => m[i].Quantity, new { @class = "form-control" })

现场示例:.NET Fiddle

【讨论】:

  • 这个解决方案仍然会产生无效的 HTML,按钮上有重复的 ID。
  • 啊,我的错误是在测试后没有删除id 部分。但该解决方案应该适用于已删除的 id 属性。
【解决方案2】:

由于您的所有文本框都具有相同的 ID,因此您无法指定要在 js 中更新哪个文本框。尝试为您的 TextBox 提供一个唯一 ID,然后当您 getElementById("UniqueID") 时,您可以确保您选择了正确的文本框。

【讨论】:

  • 所以我需要在我的文本框和按钮的 id 之后添加一个唯一的数字吗?很抱歉,对此很陌生。
【解决方案3】:

您只需要在按钮点击事件中添加波纹管代码

(this).prev('input').attr("disabled", "disabled")

【讨论】:

    【解决方案4】:

    使用局部视图,省去一些麻烦。

    <table id ="productList" class="table table-dark">
        <tr>
            <th>Product ID</th>
            <th>Title</th>
            <th>Description</th>
            <th>Quantity</th>
            <th>Add to cart</th>
        </tr>
        @foreach (var item in Model)
        {
            @Html.Partial("~/Views/_OrderRowPartial.cshtml", item)
        }
    </table>
    

    _OrderRowPartial.cshtml:

    @model item
    <tr class="active">
        <td>@item.Id</td>
        <td>@item.Title</td>
        <td>@item.Description</td>
        <td>@Html.TextBoxFor(m => m.Quantity,  new { @class = "form-control quantity" })</td>
        <td><button class="btn btn-default pull-left" onclick="disableText();">Add To Cart</button></td>
    </tr>
    

    Javascript:

    function disableText(t, el) {
      var qty = el.parentElement.previousElementSibling.getElementsByTagName('input')[0];
      mytd.style.border = "1px solid #00FF00";
      console.log(qty.value);
      if (qty.value == '') {
        qty.value = 1;
      }
    }
    

    这是一个示例,我在其中设置了边界以使正在发生的事情一目了然。不清楚是否要禁用输入或按钮,所以我都做了。

    function disableText(t, el) {
      el.style.border = "2px solid #FF0000";
      var mytd = el.parentElement;
      mytd.style.border = "1px solid #00FF00";
      var mytr = mytd.parentElement;
      var qtytd = mytd.previousElementSibling;
      var qty = qtytd.getElementsByTagName('input')[0];
      qtytd.style.border = "2px solid orange";
      qty.style.border = "2px solid cyan";
      console.log(qty.value);
      if (qty.value == '') {
        qty.value = 1;
      }
      // disable button
      el.setAttribute("disabled", "disabled");
      qty.setAttribute("disabled", "disabled");
    }
    <table id="productList" class="table table-dark">
      <tr>
        <th>Product ID</th>
        <th>Title</th>
        <th>Description</th>
        <th>Quantity</th>
        <th>Add to cart</th>
      </tr>
      <tr class="active">
        <td>1234d</td>
        <td>Cherry Pie</td>
        <td>Gooey cherry pie</td>
        <td><input type="text" class="form-control quantity" value="2" .>
          <td><button class="btn btn-default pull-left" onclick="disableText('',this);">Add To Cart</button></td>
      </tr>
      <tr class="active">
        <td>1234hd</td>
        <td>Hot Dog</td>
        <td>Dog, With mustard</td>
        <td><input type="text" class="form-control quantity" /></td>
        <td><button class="btn btn-default pull-left" onclick="disableText('',this);">Add To Cart</button></td>
      </tr>
    </table>

    【讨论】:

    • 谢谢你,马克!欣赏!
    • 我不同意qty.setAttribute("disabled", "disabled"); => 这不会按预期在表单提交上发布数量数据。使用readonly 仍然可以在阻止用户输入的同时发布数据。
    • @TetsuyaYamamoto 但OP要求禁用,就是这样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    相关资源
    最近更新 更多