【问题标题】:Required Field validation working selectively [duplicate]有选择地工作的必填字段验证[重复]
【发布时间】:2017-03-24 15:46:04
【问题描述】:

我有一个包含两个字段的视图。必填字段验证适用于其中一个,不适用于另一个。我错过了什么吗?

不工作:

<div class="form-group">
                    <div class="controls">
                        <label class="control-label" for="Selected Organizations">Selected Organization(s)</label>
                        <div class="panel panel-default">
                            <div class="panel-body" style="overflow-y: auto; max-height: 100px; min-height:50px" id="divSelOrgs">
                                @for (int i = 0; Model.Organizations != null && i < Model.Organizations.Count(); i++)
                                {
                                    var org = Model.Organizations[i];
                                    var checkedAttr = (org.Id != Guid.Empty) ? "checked='checked'" : "";
                                    <div class="row">
                                        <input type="hidden" name="Organizations.Index" value="@i" />
                                        <input type="hidden" name="Organizations[@i].Name" value="@org.Name" />
                                        <input type="hidden" name="Organizations[@i].Data" value="@org.Data" />
                                        <div class="col-xs-1">
                                            <input type="checkbox" name="Organizations[@i].Id" value="@org.Id" @checkedAttr data-org-selected="true" />
                                        </div>
                                        <div class="col-xs-11" data-toggle="tooltip" data-placement="top" title="@org.Data">@org.Name</div>
                                    </div>
                                }
                            </div>
                        </div>
                        @Html.ValidationMessageFor(m => m.Organizations)
                    </div>
                </div>

工作:

<div class="form-group">
                @Html.LabelFor(m => m.FirstName, new { @class = "control-label" })
                @Html.TextBoxFor(m => m.FirstName, new { @class = "form-control", placeholder = "First name" })
                @Html.ValidationMessageFor(m => m.FirstName)
</div>

型号代码:

 [Required]
    [Display(Name = "First Name")]
    public string FirstName { get; set; }
 [Required(ErrorMessage = "The {0} field is required.")]
    [Display(Name = "Selected Organization(s)")]
    public List<OrganizationDTO> Organizations { get; set; }

【问题讨论】:

  • 您的问题不清楚。你的意思是RequiredList 验证不起作用?如果是这样,RequiredList 不是内置的 MVC 组件。您需要检查该属性的来源,以确保您正确使用它并且首先它实际上正常运行。
  • @ChrisPratt 我将其更改为必需。并且验证仍然不起作用。
  • Required 不适用于列表类型。本质上,您所说的只是列表属性本身必须存在,不一定有 1 个或多个项目,并且它始终存在,即使它是空的。
  • 不相关,但使用@Html.HiddenFor(m =&gt; m.Organizations[i].Name) 等正确生成表单控件。并且您的复选框没有意义(如果选中,Id 属性将被绑定,如果没有,@987654328 @ 属性将是其默认值)

标签: c# asp.net-mvc data-annotations


【解决方案1】:

dataannotation 不适用于 list 类型,但您可以使用 custom attribute 验证列表以获取 validation 之类的内容

public class RequiredListAttribute : ValidationAttribute
{
    public override bool IsValid(object list)
    {
        var list = list as IList;
        if (list != null)
        {
            return list.Count > 0;
        }
        return false;
    }
}

你的财产将是

[RequiredList(ErrorMessage = "The field is required.")]
public List<OrganizationDTO> Organizations  { get; set; }

【讨论】:

  • 这会像普通的数据注释一样工作并在客户端捕获验证错误吗?
猜你喜欢
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 2019-08-30
  • 2012-05-23
  • 2013-03-23
相关资源
最近更新 更多