gpt4 book ai didi

jquery - 为表格中的动态文本框设置类验证

转载 作者:技术小花猫 更新时间:2023-10-29 12:01:39 24 4
gpt4 key购买 nike

我有一个表格,其中有一排动态文本框。示例如下:

enter image description here

我通过单击 [+] 添加新目标在表格中添加行,下面的屏幕将出现:

enter image description here

我想将验证类添加到表格内的所有文本框。所以当用户点击保存按钮时,它会勾选所有的文本框。

我尝试将这个 jquery 用于此:

 $('#tbTargetDetails tr').each(function () {
$(this).find('td input:text').each(function (i,a) {
// get each of the textbox and add validation class to it
});
});

我正在使用 MVC 5、jquery-1.10.2.js、jquery-1.10.2.min.js、jquery.validate* 和 Site.css,它们具有 input.input-validation-error

在我的模型中:

 public class ClsTargetInfo
{
public string ItemNumber_Target { get; set; }
[Required]
public string TargetColor_U { get; set; }
[Required]
public string TargetColor_V { get; set; }
[Required]
public string D90Target_U { get; set; }
[Required]
public string D90Target_V { get; set; }
[Required]
public string D10Target_U { get; set; }
[Required]
public string D10Target_V { get; set; }
[Required]
public string Thickness { get; set; }
[Required]
public string FilmWidth { get; set; }
[Required]
public string TargetDate { get; set; }
}

我在另一个模型中调用上面的模型:

public class abc
{
public IList<ClsTargetInfo> TargetInfo { get; set; }
}

下面是我添加新行时的代码:

        $("#btnAddTarget").on("click", function (event) {
AddTargetItem(jQuery('#txtTargetColorU').val(), jQuery('#txtD90TargetU').val(), jQuery('#txtD10TargetU').val(),
jQuery('#txtTargetColorV').val(), jQuery('#txtD90TargetV').val(), jQuery('#txtD10TargetV').val(),
jQuery('#txtThickness').val(), jQuery('#txtFilmWidth').val(), jQuery('#TargetDate').val());
});

function AddTargetItem(TargetColor_U, D90Target_U, D10Target_U, TargetColor_V, D90Target_V, D10Target_V, Thickness, FilmWidth, TargetDate) {
var rowCount = $('#tbTargetDetails tr').length;
//minus 1 row for header
rowCount = rowCount - 2;

var rowCountBil = rowCount + 1;

var row = '<tr style="background-color:#ffffff;" id="tr_' + rowCount + '">';
row += '<td style="font-weight:bold;padding-left:5px;padding-top:0px;padding-bottom:0px;padding-right:0px;vertical-align:middle">' + rowCountBil + '</td>';
row += '<td style="padding-left:0px;padding-top:0px;padding-bottom:0px;padding-right:0px"><input class="form-control" id="TargetInfo_' + rowCount + '__TargetColor_U" name="TargetInfo[' + rowCount + '].TargetColor_U" type="text" value="' + TargetColor_U + '" /></td>';
row += '<td style="padding-left:0px;padding-top:0px;padding-bottom:0px;padding-right:0px"><input class="form-control" id="TargetInfo_' + rowCount + '__TargetColor_V" name="TargetInfo[' + rowCount + '].TargetColor_V" type="text" value="' + TargetColor_V + '" /></td>';
row += '<td style="padding-left:0px;padding-top:0px;padding-bottom:0px;padding-right:0px"><input class="form-control" id="TargetInfo_' + rowCount + '__D90Target_U" name="TargetInfo[' + rowCount + '].D90Target_U" type="text" value="' + D90Target_U + '" /></td>';
row += '<td style="padding-left:0px;padding-top:0px;padding-bottom:0px;padding-right:0px"><input class="form-control" id="TargetInfo_' + rowCount + '__D90Target_V" name="TargetInfo[' + rowCount + '].D90Target_V" style="text-align:center;" type="text" value="' + D90Target_V + '" /></td>';
row += '<td style="padding-left:0px;padding-top:0px;padding-bottom:0px;padding-right:0px"><input class="form-control" id="TargetInfo_' + rowCount + '__D10Target_U" name="TargetInfo[' + rowCount + '].D10Target_U" style="text-align:center;" type="text" value="' + D10Target_U + '" /></td>';
row += '<td style="padding-left:0px;padding-top:0px;padding-bottom:0px;padding-right:0px"><input class="form-control" id="TargetInfo_' + rowCount + '__D10Target_V" name="TargetInfo[' + rowCount + '].D10Target_V" style="text-align:center;" type="text" value="' + D10Target_V + '" /></td>';
row += '<td style="padding-left:0px;padding-top:0px;padding-bottom:0px;padding-right:0px"><input class="form-control" id="TargetInfo_' + rowCount + '__Thickness" name="TargetInfo[' + rowCount + '].Thickness" style="text-align:center;" type="text" value="' + Thickness + '" /></td>';
row += '<td style="padding-left:0px;padding-top:0px;padding-bottom:0px;padding-right:0px"><input class="form-control" id="TargetInfo_' + rowCount + '__FilmWidth" name="TargetInfo[' + rowCount + '].FilmWidth" style="text-align:center;" type="text" value="' + FilmWidth + '" /></td>';
row += '<td style="padding-left:0px;padding-top:0px;padding-bottom:0px;padding-right:0px"><input class="form-control" id="TargetInfo_' + rowCount + '__TargetDate" name="TargetInfo[' + rowCount + '].TargetDate" style="text-align:center;" type="text" value="' + TargetDate + '" /></td>';
row += '<td style="padding-left:0px;padding-top:0px;padding-bottom:0px;padding-right:0px;vertical-align:top;"><img id="imgRemoveTarget" alt="Item Lookup" src="/Content/images/trashcan.png" style="cursor:pointer;width:32px;height:29px;" class="deleteLink" /></td>';
row += '</tr>';

//Hide the previous delete button
$('#tbTargetDetails tr:last .deleteLink').hide('fast');

$('#tbTargetDetails tr:last').after(row);
}

请帮助解决我的问题。真的很感谢你们的帮助。谢谢。

最佳答案

您没有包括必要的 data-val jquery.validate.unobtrusive.js 使用的文本框或用于显示验证消息的占位符元素的属性做客户端验证。此外,您当前的实现不允许用户删除最后一行以外的任何内容,这可以通过为索引器包含一个隐藏输入来解决,该输入允许发布非连续索引器并将其绑定(bind)到您的集合。

首先从添加一个默认值ClsTargetInfo开始反对你的TargetInfo属性并在 View 中生成它的 html

<table id="table"> // add an id attribute
<thead>.....</thead>
<tbody is="tablebody"> // add an id attribute
for(int i = 0; i < Model.TargetInfo.Count; i++)
{
<tr>
<td>
@Html.TextBoxFor(m => m.TargetInfo[i].TargetColor_U, new { id="", @class="form-control" }) // remove the unnecessary id attribute
@Html.ValidationMessageFor(m => m.TargetInfo[i].TargetColor_U)
// Add the following hidden input to only one column in the row
<input type="hidden" name="TargetInfo.Index" value=@i />
</td>
<td>
@Html.TextBoxFor(m => m.TargetInfo[i].TargetColor_V, new { id="", @class="form-control" }) // remove the unnecessary id attribute
@Html.ValidationMessageFor(m => m.TargetInfo[i].TargetColor_V)
</td>
.... // other columns
</tr>
}
</tbody>
</table>

然后检查它为 <tr> 生成的 html应该看起来像的元素

<tr>
<td>
<input data-val="true" data-val-required="The TargetColor_U field is required" name="TargetInfo[0].TargetColor_U" type="text" value="">
<span class="field-validation-valid errorText" data-valmsg-for="TargetInfo[i].TargetColor_U" data-valmsg-replace="true"></span>
<input type="hidden" name="TargetInfo.Index" value="0" />
</td>
....
</tr>

并将其复制到一个隐藏元素中,该隐藏元素位于表单标签的外部,并用虚拟字符替换索引器的所有实例,因此 name="TargetInfo[0].TargetColor_U"变成 name="TargetInfo[#].TargetColor_U" ), 并替换 value隐藏输入的属性所以 value="0"它变成value="#"

<table id="newrow" style="display:none">
.... // copy the tr element and its contents here
</table>

然后脚本看起来像

var form = $('form'); // or use the id if you have given the form an id
var newrow= $('#newrow');
var tablebody = $('#tablebody'); // modify to suit your id
$("#btnAddTarget").click(function() {
var index = (new Date()).getTime(); // unique indexer
var clone = newrow.clone(); // clone the new row
clone.html($(clone).html().replace(/#/g, index)); // update the indexer of the clone
var row = clone.find('tr');
tablebody.append(row); // add the new row to the table
// Reparse the validator
form.data('validator', null);
$.validator.unobtrusive.parse(form);
});

旁注:

  1. 通过解析 data-val 进行非侵入式验证属性首次呈现表单时。当您添加动态内容时,它是如最后两行所示重新解析验证器是必要的脚本。
  2. 为索引器添加隐藏输入允许您删除集合中的任何行,因此删除“删除”按钮是不再需要,将为用户提供更好的体验。
  3. 与其使用内联样式,不如使用 css,例如,而不是 <td style="padding-left:0px;padding-top:0px;padding-bottom:0px;padding-right:0px"> , 你应该使用 #table td { padding: 0; }在你的.css文件
  4. 虽然仅在客户端添加行可提供最佳性能,它很难维护。如果您添加或更改任何验证您的属性上的属性(例如,您稍后可能会添加一个 [StringLength]属性),您需要将 html 更新为适合。作为替代方案,您可以考虑使用 BeginCollectionItem helper 这意味着你有一个部分 View (代表表格行)。对于现有元素,您使用 foreach@Html.Partial() 循环对于新行,您使用 ajax调用返回局部 View 的 Controller 方法,以及更新 DOM

关于jquery - 为表格中的动态文本框设置类验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29837547/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com