You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 18:20:58