ASP.NET MVC异步HttpPost表单提交异常问题求助
ASP.NET MVC演员表单验证通过后无法提交的问题
在演员页面创建的表单,点击提交按钮后字段会触发验证,但验证通过后无法完成提交。目前仅能通过手动调用_service.Add(actor)或跳过验证的方式实现提交,但跳过验证会在必填字段未填写时跳转到错误页面,不符合需求。参考的课程代码可正常实现,但自己卡在此问题无法继续开发其他表单。
控制器代码
namespace Cinema_World.Controllers { public class ActorsController : Controller { private readonly IActorsService _service; public ActorsController(IActorsService service) { _service = service; } public async Task<IActionResult> Index() { var allActors = await _service.GetAll(); return View(allActors); } public async Task<IActionResult> Create() { return View(); } [HttpPost] public async Task<IActionResult> Create([Bind("FirstName,MiddleName,LastName,BirthYear,BirthPlace")] ActorModel actor) { if (!ModelState.IsValid) //断点调试时会进入该分支 {// 进入此处 return View(actor); //执行该行 } // 执行到此处后直接跳到方法末尾,浏览器无反应 _service.Add(actor); return RedirectToAction(nameof(Index)); } } }
模型代码
namespace Cinema_World.Models { public class ActorModel { [Key] public int ActorID { get; set; } [Display(Name = "First name")] [Required(ErrorMessage = "First name is a required field")] [StringLength(100, MinimumLength = 1, ErrorMessage = "First name can be between 1 and 100 characters long!")] public string FirstName { get; set; } [Display(Name = "Middle name")] [StringLength(100, MinimumLength = 1, ErrorMessage = "Middle name can be between 1 and 100 characters long!")] public string? MiddleName { get; set; } [Display(Name = "Last name")] [Required(ErrorMessage = "Last name is a required field")] [StringLength(100, MinimumLength = 1, ErrorMessage = "Last name can be between 1 and 100 characters long!")] public string LastName { get; set; } [Display(Name = "Year of Birth")] [Required(ErrorMessage = "Year of birth is a required field")] [Range(999,9999, ErrorMessage = "Input a year between 999 and 9999")] public int BirthYear { get; set; } [Display(Name = "Place of Birth")] [Required(ErrorMessage = "Place of birth is a required field")] [StringLength(100, MinimumLength = 1, ErrorMessage = "Name of the place can be between 1 and 100 characters long!")] public string BirthPlace { get; set; } public List<Actor_CinematographyModel> Actors_Cinematography { get; set; } } }
服务代码
namespace Cinema_World.Data.Services { public class ActorsService : IActorsService { private readonly ApplicationDbContext _context; public ActorsService(ApplicationDbContext context) { _context = context; } public void Add(ActorModel Actor) { _context.Actors.Add(Actor); _context.SaveChanges(); } public void Delete(int ActorID) { throw new NotImplementedException(); } public async Task<IEnumerable<ActorModel>> GetAll() { var result = await _context.Actors.ToListAsync(); return result; } public ActorModel GetById(int ActorID) { throw new NotImplementedException(); } public ActorModel Update(int ActorID, ActorModel newActor) { throw new NotImplementedException(); } } }
服务接口代码
namespace Cinema_World.Data.Services { public interface IActorsService { Task<IEnumerable<ActorModel>> GetAll(); ActorModel GetById(int ActorID); void Add(ActorModel Actor); ActorModel Update(int ActorID, ActorModel newActor); void Delete(int ActorID); } }
视图代码
<div class="row text"> <div class="col-md-8 offset-2"> <p> <h1>Add a new Actor!</h1> </p> <div class="row"> <div class="col-md-8 offset-2"> <form asp-action="Create"> <div asp-validation-summary="ModelOnly" class="text-danger"></div> <div class="form-group"> <label asp-for="FirstName" class="control-label"></label> <input asp-for="FirstName" class="form-control" /> <span asp-validation-for="FirstName" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="MiddleName" class="control-label"></label> <input asp-for="MiddleName" class="form-control" /> <span asp-validation-for="MiddleName" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="LastName" class="control-label"></label> <input asp-for="LastName" class="form-control" /> <span asp-validation-for="LastName" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="BirthYear" class="control-label"></label> <input asp-for="BirthYear" class="form-control" /> <span asp-validation-for="BirthYear" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="BirthPlace" class="control-label"></label> <input asp-for="BirthPlace" class="form-control" /> <span asp-validation-for="BirthPlace" class="text-danger"></span> </div> <div class="form-group mt-2"> <input type="submit" value="Create" class="btn btn-outline-success float-end"/> <a class="btn btn-outline-dark" asp-action="Index">Show all</a> </div> </form> </div> </div> </div> </div>
已尝试的解决方法
- 将
!ModelState.IsValid替换为ModelState.IsValid并将提交代码放入分支中,虽能实现提交,但并非理想方案。 - 重命名方法、使用智能提示生成新函数。
注:服务本身可正常工作,手动调用提交代码能成功,但加入验证逻辑后提交按钮无反应。自身ASP.NET MVC知识基础,可能遗漏或错误配置了某些内容。
内容的提问来源于stack exchange,提问作者Gunars
相关产品推荐
相关产品推荐

