Web API注册页面打开报400验证错误问题求助
我用Web API搭建网站,简单的GET功能正常,但添加POST注册接口和Razor注册页面后,打开该页面就返回400验证错误,提示“workerId的值'register'无效”。这个API接口在Swagger里调用正常,我试过删除POST方法核心代码、清空页面内容,问题还是没解决。
API端WorkerController注册片段
[HttpPost("register")] [ProducesResponseType(204)] [ProducesResponseType(400)] public IActionResult Register(Worker workerCreate) { if (workerCreate == null) return BadRequest(ModelState); var worker = _workerRepository.GetWorkers() .Where(x => x.Email.Trim().ToUpper() == workerCreate.Email.ToUpper() || x.PhoneNum.Trim().ToUpper() == workerCreate.PhoneNum.ToUpper()) .FirstOrDefault(); if (worker != null) { ModelState.AddModelError("", "Worker already exists"); return StatusCode(422, ModelState); } if (!ModelState.IsValid) { return BadRequest(ModelState); } if (!_workerRepository.Register(workerCreate)) { ModelState.AddModelError("", "Something went wrong while saving"); return StatusCode(500, ModelState); } return Ok("Successfully registered"); }
Web应用端WorkerController代码
public IActionResult Register() { return View(); } [HttpPost] public async Task<IActionResult> Register(WebApplicationWorker worker) { var apiUrl = "https://localhost:7071/api/Worker/register"; worker.Id = 0; string jsonPayload = JsonConvert.SerializeObject(worker); HttpContent content = new StringContent(jsonPayload, Encoding.UTF8, "application/json"); using (var response = await _httpClient.PostAsync(apiUrl, content)) { if (response.IsSuccessStatusCode) { return RedirectToAction("Workers"); } else { ModelState.AddModelError(string.Empty, "Ошибка регистрации"); } } return View(worker); }
WebApplicationWorker模型代码
using System.Text.Json.Serialization; namespace CourseWorkZakharov.Web.Models { public class WebApplicationWorker { [JsonIgnore] public int Id { get; set; } public string Name { get; set; } public string LastName { get; set; } public string PhoneNum { get; set; } public string Email { get; set; } public string Degree { get; set; } public string WorkExp { get; set; } public string Description { get; set; } public string ImagePath { get; set; } public string Password { get; set; } } }
Register Razor页面代码
@model WebApplicationWorker <h1>Регистрация пользователя</h1> @using (Html.BeginForm("Register", "Worker", FormMethod.Post, new { enctype = "multipart/form-data" })) { <div> @Html.LabelFor(m => m.Name) @Html.TextBoxFor(m => m.Name) </div> <div> @Html.LabelFor(m => m.LastName) @Html.TextBoxFor(m => m.LastName) </div> <div> @Html.LabelFor(m => m.PhoneNum) @Html.TextBoxFor(m => m.PhoneNum) </div> <div> @Html.LabelFor(m => m.Email) @Html.TextBoxFor(m => m.Email) </div> <div> @Html.LabelFor(m => m.Degree) @Html.TextBoxFor(m => m.Degree) </div> <div> @Html.LabelFor(m => m.WorkExp) @Html.TextBoxFor(m => m.WorkExp) </div> <div> @Html.LabelFor(m => m.Description) @Html.TextBoxFor(m => m.Description) </div> <div> @Html.LabelFor(m => m.ImagePath) @Html.TextBoxFor(m => m.ImagePath, new { type = "file" }) </div> <div> @Html.LabelFor(m => m.Password) @Html.PasswordFor(m => m.Password) </div> <button type="submit">Зарегистрироваться</button> }
核心问题:路由冲突
打开页面触发的GET请求被API路由错误捕获了。推测你的API端WorkerController配置了类似[Route("api/[controller]/{workerId}")]或[HttpGet("{workerId}")]的路由规则,当你访问/Worker/Register时,API会把Register当成workerId(int类型参数),无法转换导致400错误。
修复步骤
明确区分API与MVC路由前缀
给API端WorkerController添加全局路由前缀,避免和MVC路由混淆:[Route("api/[controller]")] // API接口路径统一为/api/Worker/xxx [ApiController] public class WorkerController : ControllerBase { // 你的API方法... }这样API注册接口路径是
/api/Worker/register,MVC注册页面路径是/Worker/Register,两者完全隔离。检查MVC路由配置
确认Startup.cs/Program.cs中的MVC路由规则正确,能匹配到WorkerController的Register GET动作:app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");修正表单提交的enctype问题(额外优化)
你的Razor表单设置了enctype="multipart/form-data",但后端代码是将模型序列为JSON提交到API,两者不匹配。如果暂时不需要处理文件上传,可去掉enctype:@using (Html.BeginForm("Register", "Worker", FormMethod.Post))若需要上传图片,需修改后端逻辑处理multipart表单数据,而非直接序列化JSON。
内容的提问来源于stack exchange,提问作者Yukon

