MVC ModelState.AddModelError使用

本文介绍在CSHTML中如何使用@Html.CheckBoxFor方法创建复选框,并展示了如何在控制器中通过ModelState.AddModelError进行表单验证,确保PostNextDay字段符合预期。详细解释了CSHTML与MVC框架结合使用时的表单元素生成及验证过程。

 

cshtml:红色部分为使用方法  PostNextDay是 字段

 <div id="postNextDay" class="col-xs-12 col-sm-6 col-md-4">
                                <div class="form-group checkbox">
                                    @Html.CheckBoxFor(m => m.PostNextDay)
                                    @Html.LabelFor(m => m.PostNextDay)
                                    @Html.ValidationMessageFor(m => m.PostNextDay)
                                </div>
                            </div>

可以在Controller中写验证来控制,第一个参数 key 第二个参数 提示内容

  ModelState.AddModelError("PostNextDay", $"在这里写提示内容");

 

转载于:https://www.cnblogs.com/Early-Bird/p/9002583.html

[HttpPost] public ActionResult AddTask(string title, string content, string deadline, string priority, string status) { // 处理标题 if (string.IsNullOrEmpty(title)) { ModelState.AddModelError("title", "任务标题不能为空"); return View("TaskAdd"); } // 处理截止日期 DateTime? parsedDeadline = null; if (!string.IsNullOrEmpty(deadline)) { if (!DateTime.TryParse(deadline, out DateTime dt)) { ModelState.AddModelError("deadline", "截止日期格式不正确"); return View("TaskAdd"); } parsedDeadline = dt; } // 处理优先级 if (!sbyte.TryParse(priority, out sbyte p) || p < 1 || p > 3) { ModelState.AddModelError("priority", "优先级设置不正确"); return View("TaskAdd"); } // 处理状态 if (!sbyte.TryParse(status, out sbyte s) || s < 0 || s > 2) { ModelState.AddModelError("status", "状态设置不正确"); return View("TaskAdd"); } // 创建实体时使用正确的变量名 var newTask = new task { id = Guid.NewGuid().ToString().Replace("-", ""), title = title, // 对应表单的 name="title" content = content ?? "", create_time = DateTime.Now, deadline = parsedDeadline, priority = p, status = s, }; db.tasks.Add(newTask); db.SaveChanges(); // 若字段名匹配,此处应能正常保存 var attachments = Request.Files; // 获取所有上传的文件 for (int i = 0; i < attachments.Count; i++) { var file = attachments[i]; // 验证:只处理有内容的文件 try { // 准备文件存储路径 var uploadDir = Server.MapPath("~/Uploads"); // 服务器存储目录 if (!Directory.Exists(uploadDir)) { Directory.CreateDirectory(uploadDir); // 目录不存在则创建 } // 生成唯一文件名(避免重复覆盖) var fileExt = Path.GetExtension(file.FileName); // 获取扩展名(如.jpg) var uniqueFileName = $"{Guid.NewGuid()}{fileExt}"; // 唯一文件名 var savePath = Path.Combine(uploadDir, uniqueFileName); // 完整存储路径 //保存文件到服务器 file.SaveAs(savePath); //创建附件实体并关联任务 var newAttachment = new task_attachment { id = Guid.NewGuid().ToString().Replace("-", ""), originalname = "123.txt", filename = uniqueFileName, file_path = $"~/Uploads/{uniqueFileName}", file_size = file.ContentLength, // 文件大小(字节) upload_time = DateTime.Now, }; db.task_attachment.Add(newAttachment); } catch (Exception ex) { ModelState.AddModelError("attachment", $"文件上传失败:{ex.Message}"); return View("TaskAdd"); } } // 7. 保存附件信息到数据库 db.SaveChanges(); return RedirectToAction("TaskAdd"); }优化代码
08-16
// Controllers/AdminController.cs using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using UserManagementSystem.Web.Models; using UserManagementSystem.Web.Services; namespace UserManagementSystem.Web.Controllers; [Authorize(Roles = "Admin")] public class AdminController : Controller { private readonly UserManager<ApplicationUser> _userManager; public AdminController(UserManager<ApplicationUser> userManager) { _userManager = userManager; } // GET: /Admin/Users public async Task<IActionResult> Users(string search, int page = 1, int pageSize = 10) { var query = _userManager.Users.AsQueryable(); if (!string.IsNullOrWhiteSpace(search)) { search = search.Trim(); query = query.Where(u => u.UserName.Contains(search) || u.Email.Contains(search)); } var total = await query.CountAsync(); var users = await query .OrderBy(u => u.RegisterDate) .Skip((page - 1) * pageSize) .Take(pageSize) .ToListAsync(); ViewBag.Search = search; ViewBag.CurrentPage = page; ViewBag.PageSize = pageSize; ViewBag.TotalPages = (int)Math.Ceiling(total / (double)pageSize); return View(users); } // GET: /Admin/CreateUser public IActionResult CreateUser() { return View(); } // POST: /Admin/CreateUser [HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> CreateUser(CreateUserViewModel model) { if (!ModelState.IsValid) { return View(model); } var user = new ApplicationUser { UserName = model.Email, Email = model.Email, EmailConfirmed = true, RegisterDate = DateTime.UtcNow }; var result = await _userManager.CreateAsync(user, model.Password); if (result.Succeeded) { TempData["Success"] = $"用户 {user.Email} 创建成功。"; return RedirectToAction(nameof(Users)); } foreach (var error in result.Errors) { ModelState.AddModelError("", error.Description); } return View(model); } // GET: /Admin/EditUser/{id} public async Task<IActionResult> EditUser(string id) { var user = await _userManager.FindByIdAsync(id); if (user == null) return NotFound(); var model = new EditUserViewModel { Id = user.Id, UserName = user.UserName!, Email = user.Email! }; return View(model); } // POST: /Admin/EditUser [HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> EditUser(EditUserViewModel model) { if (!ModelState.IsValid) { return View(model); } var user = await _userManager.FindByIdAsync(model.Id); if (user == null) return NotFound(); // 防止编辑关键系统账户 if (user.Email == "admin@example.com") { TempData["Error"] = "无法编辑系统管理员账户。"; return RedirectToAction(nameof(Users)); } user.UserName = model.UserName; user.Email = model.Email; var result = await _userManager.UpdateAsync(user); if (result.Succeeded) { TempData["Success"] = $"用户信息已更新:{user.Email}"; return RedirectToAction(nameof(Users)); } foreach (var error in result.Errors) { ModelState.AddModelError("", error.Description); } return View(model); } // GET: /Admin/ResetPassword/{id} [HttpGet] public async Task<IActionResult> ResetPassword(string id) { var user = await _userManager.FindByIdAsync(id); if (user == null) return NotFound(); // 1. 生成密码重置 Token(安全令牌) var token = await _userManager.GeneratePasswordResetTokenAsync(user); // 2. 生成强密码 string newPassword = PasswordGenerator.GenerateRandomPassword(12); // 3. 使用 ResetPassword 直接重置(无需移除旧密码) var result = await _userManager.ResetPasswordAsync(user, token, newPassword); if (!result.Succeeded) { foreach (var error in result.Errors) { ModelState.AddModelError("", $"密码重置失败: {error.Description}"); } return View(new ResetPasswordViewModel { UserId = user.Id, UserName = user.UserName, GeneratedPassword = null }); } // 4. 刷新用户安全戳(强制所有旧 Token 失效) await _userManager.UpdateSecurityStampAsync(user); // 5. 成功 → 显示新密码 var model = new ResetPasswordViewModel { UserId = user.Id, UserName = user.UserName, GeneratedPassword = newPassword }; return View(model); } // POST: Admin/ResetPassword [HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> ResetPassword(string userId, string newPassword, string confirmPassword) { if (string.IsNullOrEmpty(newPassword) || newPassword != confirmPassword) { ModelState.AddModelError("", "密码不匹配或为空。"); return View(new ResetPasswordViewModel { UserId = userId }); } var user = await _userManager.FindByIdAsync(userId); if (user == null) return NotFound(); // 删除旧密码令牌(可选) await _userManager.RemovePasswordAsync(user); // 设置新密码 var result = await _userManager.AddPasswordAsync(user, newPassword); if (result.Succeeded) { TempData["SuccessMessage"] = "密码已成功重置!"; return RedirectToAction(nameof(Users)); } foreach (var error in result.Errors) { ModelState.AddModelError("", error.Description); } return View(new ResetPasswordViewModel { UserId = userId }); } // POST: /Admin/DeleteUser/{id} [HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> DeleteUser(string id) { var user = await _userManager.FindByIdAsync(id); if (user == null || user.Email == "admin@example.com") { TempData["Error"] = "无法删除此用户。"; return RedirectToAction(nameof(Users)); } var result = await _userManager.DeleteAsync(user); if (result.Succeeded) { TempData["Success"] = $"用户 {user.Email} 已被删除。"; } else { TempData["Error"] = "删除失败:" + string.Join(", ", result.Errors.Select(e => e.Description)); } return RedirectToAction(nameof(Users)); } } 还是重置密码后无法登陆
10-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值