c# - 使用数据注释使复选框成为必需
问题描述
我想向用户显示消息,如果未选中复选框,他必须在提交表单后接受条款,如果选中复选框,则提交表单。
我的模型上有这个代码:
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>
我看到很多例子,但不起作用。有人可以给建议吗?
解决方案
您可以参考以下示例:
创建一个 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; } }
添加自定义验证方法:
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; } }
创建 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(); }
创建一个 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");} }
然后,截图如下:
推荐阅读
- python - 试图制作一个三角形“*”
- javascript - React Native Touchable Highlight 不改变子“视图”和“文本”的样式
- python - 如何在 Visual Studio 代码中配置 pylint 以在项目目录中搜索模块
- identityserver4 - IdentityServer logoutId 为空
- javascript - 如何识别带有.js扩展名的nodejs中的二进制文件?
- c# - 有没有更有效的方法来分块文本文件,同时保持编码和标题?
- excel - 通过 VBA 中的 DAO.Database 清除数据库连接
- ssl - Gmail 中的安全邮件导入(纯文本和 ssl 配置)
- laravel - Laravel 渴望加载深层关系
- angular - 如何将数据分配给组件中的变量?