首页 > 解决方案 > 使用数据注释使复选框成为必需

问题描述

我想向用户显示消息,如果未选中复选框,他必须在提交表单后接受条款,如果选中复选框,则提交表单。

我的模型上有这个代码:

public class UserClass
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Required(ErrorMessage = "Entry ID")]
    public int ID { get; set; }
    [Required(ErrorMessage = "Entry Name")]
    public string Name { get; set; }
}

控制器:

private readonly ApplicationUserClass _auc;
public abcController(ApplicationUserClass auc)
{
    _auc = auc;
}

public IActionResult Index()
{
    return View();
}

public IActionResult Create()
{
    return View();
}

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Create(UserClass uc)
{
    _auc.Add(uc);
    _auc.SaveChanges();
    return View();
}

看法:

<div class="row">
    <div class="col-md-9">
        <form asp-action="Create">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="ID" class="control-label"></label>
                <input asp-for="ID" class="form-control" />
                <span asp-validation-for="ID" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Name" class="control-label"></label>
                <input asp-for="Name" class="form-control" />
                <span asp-validation-for="Name" class="text-danger"></span>
            </div>

            <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <input type="submit" value="sumbit" class="btn btn-primary" />
                </div>
            </div>
            <b>@ViewBag.message</b>
        </form>
    </div>
</div>

我看到很多例子,但不起作用。有人可以给建议吗?

标签: c#.netasp.net-core-mvc

解决方案


您可以参考以下示例:

  1. 创建一个 UserViewModel 在 View 和控制器之间传输数据:

     public class UserViewModel
     {
         [Required(ErrorMessage = "Entry ID")]
         public int ID { get; set; }
         [Required(ErrorMessage = "Entry Name")]
         public string Name { get; set; } 
         //use custom validation method
         [CheckBoxRequired(ErrorMessage ="Please checked the items")]
         public bool IsAccepted { get; set; } 
     }
    
  2. 添加自定义验证方法:

     public class CheckBoxRequired : ValidationAttribute
     {
         protected override ValidationResult IsValid(object value, ValidationContext validationContext)
         {
             //get the entered value
             var student = (UserViewModel)validationContext.ObjectInstance;
             //Check whether the IsAccepted is selected or not.
             if (student.IsAccepted == false)
             { 
                 //if not checked the checkbox, return the error message.
                 return new ValidationResult(ErrorMessage == null ? "Please checked the checkbox" : ErrorMessage); 
             }
             return  ValidationResult.Success;
         }
     }
    
  3. 创建 Action 方法来创建用户并使用 UserViewModel 在 View 和 Controller 之间传输数据。

         public IActionResult CreateUser()
         {
             return View();
         }
         [HttpPost]
         public IActionResult CreateUser(UserViewModel user)
         {
             if (ModelState.IsValid)
             {
                //after validation success, create a UserClass instance based on the ViewModel, and insert the "newuser" into database.
                 var newuser = new UserClass();
                 newuser.ID = user.ID;
                 newuser.Name = user.Name;       
                 //save the newuser into the database via dbcontext
                 _dbcontext.UserClass.Add(newuser);
                 _dbcontext.SaveChanges();
                 return RedirectToAction(nameof(Index));
             }
             return View();
         }
    
  4. 创建一个 CreateUser 视图页面:

         @model WebApplication2.Models.UserViewModel
    
         @{
             ViewData["Title"] = "CreateUser";
             Layout = "~/Views/Shared/_Layout.cshtml";
         } 
         <div class="row">
             <div class="col-md-6">
                 <form asp-action="CreateUser">
                     <div asp-validation-summary="ModelOnly" class="text-danger"></div>
                     <div class="form-group">
                         <label asp-for="ID" class="control-label"></label>
                         <input asp-for="ID" class="form-control" />
                         <span asp-validation-for="ID" class="text-danger"></span>
                     </div>
                     <div class="form-group">
                         <label asp-for="Name" class="control-label"></label>
                         <input asp-for="Name" class="form-control" />
                         <span asp-validation-for="Name" class="text-danger"></span>
                     </div>
                     <div class="form-group form-check">
                         <label class="form-check-label">
                             <input class="form-check-input" asp-for="IsAccepted" /> @Html.DisplayNameFor(model => model.IsAccepted)
    
                         </label>
                         <span asp-validation-for="IsAccepted" class="text-danger"></span>
                     </div> 
                     <div class="form-group">
                         <input type="submit" value="Create" class="btn btn-primary" />
                     </div>
                 </form>
             </div>
         </div> 
    
         @section Scripts {
             @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
         }
    

然后,截图如下:

在此处输入图像描述


推荐阅读