在asp.net mvc 5中进行复选框列表自定义验证

在asp.net mvc 5中进行复选框列表自定义验证,asp.net,asp.net-mvc,validation,asp.net-mvc-5,Asp.net,Asp.net Mvc,Validation,Asp.net Mvc 5,我正在开发一个ASP.NETMVC5Web应用程序,在对复选框列表进行自定义验证时遇到了一些困难。验证我需要至少选中一个复选框 我的视图模型 public class EditUtilisateurViewModel { public long Id { get; set; } [Required(AllowEmptyStrings = false, ErrorMessage = " Required ")] [Display(Name = "Login")] public string Us

我正在开发一个ASP.NETMVC5Web应用程序,在对复选框列表进行自定义验证时遇到了一些困难。验证我需要至少选中一个复选框

我的视图模型

public class EditUtilisateurViewModel
{
public long Id { get; set; }

[Required(AllowEmptyStrings = false, ErrorMessage = " Required ")]
[Display(Name = "Login")]
public string UserName { get; set; }

[Required(AllowEmptyStrings = false, ErrorMessage = "Required")]
[Display(Name = "Email")]
[EmailAddress (ErrorMessage = "Invalid Email")]
public string Email { get; set; }

[CheckOneSelected(ErrorMessage = "Please select role")]
public IEnumerable<System.Web.Mvc.SelectListItem> RolesList { get; set; }

}
公共类EditUsiateUrViewModel
{
公共长Id{get;set;}
[必需(AllowEmptyStrings=false,ErrorMessage=“必需”)]
[显示(Name=“登录”)]
公共字符串用户名{get;set;}
[必需(AllowEmptyStrings=false,ErrorMessage=“必需”)]
[显示(Name=“电子邮件”)]
[电子邮件地址(ErrorMessage=“无效电子邮件”)]
公共字符串电子邮件{get;set;}
[选中复选框(ErrorMessage=“请选择角色”)]
公共IEnumerable角色列表{get;set;}
}
我的控制器

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Edit([Bind(Include = "Id,UserName,Email")] EditUtilisateurViewModel editUser, params string[] selectedRole)
{
if (ModelState.IsValid)
{
    // ToDo ...

    return RedirectToAction("Index");
}
}
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务编辑([Bind(Include=“Id,UserName,Email”)]editUsitateUrViewModel editUser,参数字符串[]selectedRole)
{
if(ModelState.IsValid)
{
//待办事项。。。
返回操作(“索引”);
}
}
我的看法

@model MyProject.Areas.Admin.Models.EditUtilisateurViewModel

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)
    @Html.HiddenFor(m => m.Id)
    <table
        <tbody>
            < >
                <th>
                    @Html.LabelFor(m => m.UserName)
                </th>
                <td>
                    @Html.TextBoxFor(m => m.UserName)
                    @Html.ValidationMessageFor(m => m.UserName)
                </td>
            </tr>
            <tr>
                <th>
                    @Html.LabelFor(m => m.Email)
                </th>
                <td>
                    @Html.TextBoxFor(m => m.Email, new { @class = "form-control", @disabled = "disabled" })
                    @*@Html.ValidationMessageFor(m => m.Email)*@
                </td>
            </tr>
            <tr>
                <th>@Html.Label("Roles")</th>
                <td>
                    <span>
                        @foreach (var item in Model.RolesList)
                        {
                            @*<input type="checkbox" id="@item.Value" name="SelectedRole" value="@item.Value" checked="@item.Selected" class="checkbox-inline" />*@
                            @Html.CheckBoxFor(m => item.Selected, new { id = item.Value, @Value = item.Value, @Name = "selectedRole[]", @class = "checkbox-inline", data_val = "true", data_val_verifListe = " Select field " })
                            @Html.Label(item.Value, new { @class = "checkbox-inline-label" })
                        }
                    </span>
                    @Html.ValidationMessageFor(m => m.RolesList)
                </td>
            </tr>
        </tbody>
    </table>
    <p>
        <input type="submit" value="Update" />
    </p>
}
@model MyProject.Areas.Admin.Models.editUsitateUrViewModel
@使用(Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
@Html.HiddenFor(m=>m.Id)
@LabelFor(m=>m.UserName)
@Html.TextBoxFor(m=>m.UserName)
@Html.ValidationMessageFor(m=>m.UserName)
@LabelFor(m=>m.Email)
@TextBoxFor(m=>m.Email,新的{@class=“form control”,@disabled=“disabled”})
@*@Html.ValidationMessageFor(m=>m.Email)*@
@Html.Label(“角色”)
@foreach(Model.RolesList中的var项)
{
@**@
@Html.CheckBoxFor(m=>item.Selected,new{id=item.Value,@Value=item.Value,@Name=“selectedRole[]”,@class=“checkbox内联”,data\u val=“true”,data\u val\u verifListe=“Select field”})
@Label(item.Value,新的{@class=“checkbox inline Label”})
}
@Html.ValidationMessageFor(m=>m.RolesList)

}
我尝试了下面的验证,但没有成功

namespace ...
{
    public class CheckOneSelectedAttribute : ValidationAttribute, IClientValidatable
    {
        public string[] SelectedRole { get; private set; }

        public CheckOneSelectedAttribute(string SelectedValue) : base("Select field")
        {
            if (SelectedValue != null && SelectedValue.Length > 0)
                SelectedRole = SelectedValue;
        }

        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            if (value != null)
            {
                if (selectedRole != null)
                {
                    if (selectedRole.Length == 0)
                    {
                        return new ValidationResult("Select field ");
                    }
                }
            }
            else
            {
                return new ValidationResult("Null parameter");
            }
            return ValidationResult.Success;
        }

        public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
        {
            yield return new ModelClientValidationRule()
            {
                ErrorMessage = ErrorMessageString,
                ValidationType = "CheckOneSelected"
            };
        }
    }
}
名称空间。。。
{
公共类CheckOneSelectedAttribute:ValidationAttribute,IClientValidable
{
公共字符串[]SelectedRole{get;private set;}
public CheckOneSelectedAttribute(字符串SelectedValue):基本(“选择字段”)
{
if(SelectedValue!=null&&SelectedValue.Length>0)
SelectedRole=SelectedValue;
}
受保护的重写ValidationResult有效(对象值,ValidationContext ValidationContext)
{
if(值!=null)
{
if(selectedRole!=null)
{
if(selectedRole.Length==0)
{
返回新的ValidationResult(“选择字段”);
}
}
}
其他的
{
返回新的ValidationResult(“空参数”);
}
返回ValidationResult.Success;
}
公共IEnumerable GetClientValidationRules(ModelMetadata元数据、ControllerContext上下文)
{
返回新的ModelClientValidationRule()
{
ErrorMessage=ErrorMessageString,
ValidationType=“CheckOneSelected”
};
}
}
}
谁能帮帮我吗?
谢谢。

在控制器部分的post和takes[]列表中,您应该检查列表的长度,这样您就可以对此进行验证。

这是很多代码。您对它有什么问题?始终返回参数的空值。