列表验证(数据注释)在客户端不起作用
List validation(data annotation) not working on the client side
我有一个群组列表,其中有一个与之关联的自定义属性方法。它似乎没有在屏幕上捕捉到验证错误。但是在控制器上,它给出 ModelState.Valid 为 false。有没有办法在视图中捕获它,而不是必须转到服务器端然后捕获并显示它?
其他验证工作正常,因此不会出现丢失 jquery 个文件的情况。
型号:
[RequiredList(ErrorMessage = "The {0} field is required.")]
[Display(Name = "Selected Organization(s)")]
public List<OrganizationDTO> Organizations { get; set; }
自定义属性:
public class RequiredListAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
var list = value as IList;
if (list != null)
{
return list.Count > 0;
}
return false;
}
}
查看:
<div class="form-group">
<div class="controls">
<label class="control-label" for="Selected Groups">Selected Group(s)</label>
<div class="panel panel-default">
<div class="panel-body" style="overflow-y: auto; max-height: 100px; min-height:50px" id="divSelGroups">
@for (int i = 0; Model.Groups!= null && i < Model.Groups.Count(); i++)
{
var group= Model.Groups[i];
var checkedAttr = (group.Id != Guid.Empty) ? "checked='checked'" : "";
<div class="row">
<input type="hidden" name="Groups.Index" value="@i" />
<input type="hidden"name="Groups[@i].Name" value="@group.Name" />
<input type="hidden" name="Groups[@i].Data" value="@group.Data" />
<div class="col-xs-1">
<input type="checkbox" name="Groups[@i].Id" value="@group.Id" @checkedAttr data-org-selected="true" />
</div>
<div class="col-xs-11" data-toggle="tooltip" data-placement="top" title="@group.Data">@group.Name</div>
</div>
}
</div>
</div>
@Html.ValidationMessageFor(m => m.Groups)
</div>
</div>
根据以上信息,当验证在控制器中正常工作但在视图中不起作用时,可能会出现与 jquery 验证文件有关的问题。
所以在您看来,如果您还没有引用 jquery 文件,请像下面这样引用它:
<script src="/Scripts/jquery.unobtrusive-ajax.js"></script>
<script src="/Scripts/jquery.validate.js"></script>
<script src="/Scripts/jquery.validate.unobtrusive.js"></script>
还要确保您的 webconfig 文件中有以下条目:
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
希望以上信息对您有用,请告诉我您的想法或反馈
谢谢
卡尔提克
我必须包括一个变通方法才能使其正常工作,尽管没有回答我原来的问题仍然得到解决问题的要求。我不得不引入一个隐藏的文本框,其中包含列表项的数量,并在其上放置一个范围验证器。
型号:
[Range(1, double.MaxValue, ErrorMessage = "Atleast one organization needs to be selected.")]
public int OrgCount { get; set; }
查看:
@Html.TextBoxFor(m => m.OrgCount, new { style="visibility:hidden;height:0"})
@Html.ValidationMessageFor(m => m.OrgCount)
JS 脚本:
var orgCount = $(".panel-body input[name='Organizations.Index']").last().val();
if (isNaN(orgCount))
orgCount = -1;
$("#OrgCount").val(parseInt(orgCount) + 1);
所以基本上,如果没有元素,我将其设为 0,因此它们无法通过验证,因此会显示范围验证器错误消息。
我有一个群组列表,其中有一个与之关联的自定义属性方法。它似乎没有在屏幕上捕捉到验证错误。但是在控制器上,它给出 ModelState.Valid 为 false。有没有办法在视图中捕获它,而不是必须转到服务器端然后捕获并显示它? 其他验证工作正常,因此不会出现丢失 jquery 个文件的情况。
型号:
[RequiredList(ErrorMessage = "The {0} field is required.")]
[Display(Name = "Selected Organization(s)")]
public List<OrganizationDTO> Organizations { get; set; }
自定义属性:
public class RequiredListAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
var list = value as IList;
if (list != null)
{
return list.Count > 0;
}
return false;
}
}
查看:
<div class="form-group">
<div class="controls">
<label class="control-label" for="Selected Groups">Selected Group(s)</label>
<div class="panel panel-default">
<div class="panel-body" style="overflow-y: auto; max-height: 100px; min-height:50px" id="divSelGroups">
@for (int i = 0; Model.Groups!= null && i < Model.Groups.Count(); i++)
{
var group= Model.Groups[i];
var checkedAttr = (group.Id != Guid.Empty) ? "checked='checked'" : "";
<div class="row">
<input type="hidden" name="Groups.Index" value="@i" />
<input type="hidden"name="Groups[@i].Name" value="@group.Name" />
<input type="hidden" name="Groups[@i].Data" value="@group.Data" />
<div class="col-xs-1">
<input type="checkbox" name="Groups[@i].Id" value="@group.Id" @checkedAttr data-org-selected="true" />
</div>
<div class="col-xs-11" data-toggle="tooltip" data-placement="top" title="@group.Data">@group.Name</div>
</div>
}
</div>
</div>
@Html.ValidationMessageFor(m => m.Groups)
</div>
</div>
根据以上信息,当验证在控制器中正常工作但在视图中不起作用时,可能会出现与 jquery 验证文件有关的问题。
所以在您看来,如果您还没有引用 jquery 文件,请像下面这样引用它:
<script src="/Scripts/jquery.unobtrusive-ajax.js"></script>
<script src="/Scripts/jquery.validate.js"></script>
<script src="/Scripts/jquery.validate.unobtrusive.js"></script>
还要确保您的 webconfig 文件中有以下条目:
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
希望以上信息对您有用,请告诉我您的想法或反馈
谢谢
卡尔提克
我必须包括一个变通方法才能使其正常工作,尽管没有回答我原来的问题仍然得到解决问题的要求。我不得不引入一个隐藏的文本框,其中包含列表项的数量,并在其上放置一个范围验证器。
型号:
[Range(1, double.MaxValue, ErrorMessage = "Atleast one organization needs to be selected.")]
public int OrgCount { get; set; }
查看:
@Html.TextBoxFor(m => m.OrgCount, new { style="visibility:hidden;height:0"})
@Html.ValidationMessageFor(m => m.OrgCount)
JS 脚本:
var orgCount = $(".panel-body input[name='Organizations.Index']").last().val();
if (isNaN(orgCount))
orgCount = -1;
$("#OrgCount").val(parseInt(orgCount) + 1);
所以基本上,如果没有元素,我将其设为 0,因此它们无法通过验证,因此会显示范围验证器错误消息。