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

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错误。

修复步骤

  1. 明确区分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,两者完全隔离。

  2. 检查MVC路由配置
    确认Startup.cs/Program.cs中的MVC路由规则正确,能匹配到WorkerController的Register GET动作:

    app.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
    
  3. 修正表单提交的enctype问题(额外优化)
    你的Razor表单设置了enctype="multipart/form-data",但后端代码是将模型序列为JSON提交到API,两者不匹配。如果暂时不需要处理文件上传,可去掉enctype:

    @using (Html.BeginForm("Register", "Worker", FormMethod.Post))
    

    若需要上传图片,需修改后端逻辑处理multipart表单数据,而非直接序列化JSON。

内容的提问来源于stack exchange,提问作者Yukon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 01:07:01