ASP.NET Core 6 MVC - 当 GET 操作方法接收参数时未命中 POST 方法

问题描述 投票:0回答:1

为什么这不起作用?

在创建

GET
时,我收到一个可选的
idEnt
参数。

如果我在浏览器中调用

MyController/Create/5
,它显示视图正常,甚至客户端验证也正常,但在表单提交时,控制器中的
POST
操作方法没有被命中...为什么?

(它也不会抛出任何异常,它只是重新加载视图)

控制器:

[Route("MyController/Create/{idEnt:int?}")]
public async Task<IActionResult> Create(int? idEnt) 
{
    MyEntity ent = db.Find(idEnt);

    var mod = new Mod() { idEnt = idEnt }

    return View(mod);
}

[HttpPost]
[ValidateAntiForgeryToken]
[WebTrail(AuditLevel = 3)]
public async Task<IActionResult> Create(Mod mod) 
{
    if (ModelState.IsValid) 
    {
        _db.Add(mod);
        await _db.SaveChangesAsync();
        return RedirectToAction(nameof(Index));
    }

    return View(mod);
}

查看:

@model My.Namespace.Mod
    <div>
        <form asp-action="Create">
            <input type="hidden" asp-for="Id" />
            <input type="hidden" asp-for="IdEnt" />

            <label asp-for="someField" class="control-label"></label>
            <input asp-for="someField" class="form-control" />
            <span asp-validation-for="someField" class="text-danger"></span>

            //more form inputs etc here

            <input type="submit" value="Save" class="btn btn-primary" />
        </form>
    </div>
@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

型号:

public class Mod 
{
    public int Id { get; set; }

    [ForeignKey("Ent")]
    public int? IdEnt { get; set; }

    [DisplayFormat(DataFormatString = "{0}€", NullDisplayText = "---")]
    [Column(TypeName = "decimal(15,2)")]
    public decimal? SomeField { get; set; }

    public virtual Ent Ent { get; set; }
}
asp.net-core-mvc .net-6.0
1个回答
0
投票

如果我在浏览器 MyController/Create/5 中调用,它显示视图正常,甚至客户端验证工作正常,但在表单提交时,控制器中的 POST 操作方法没有被命中...为什么?

[Route("MyController/Create/{idEnt:int?}")]
public async Task<IActionResult> Create(int? idEnt) 

根据您的代码,我们可以发现您在第一个操作方法中使用

[Route("MyController/Create/{idEnt:int?}")]
来定义带有可选路由参数
idEnt
的路由,它将接受所有HTTP方法,而不是仅接受HTTP GET请求,这导致了这个问题。

要修复它,您可以尝试修改如下代码:

[HttpGet("Home/Create/{idEnt:int?}")]
public async Task<IActionResult> Create(int? idEnt)
{
    //...
    //your code logic here
    //...

    return View(mod);
}

[HttpPost]
[ValidateAntiForgeryToken]
[WebTrail(AuditLevel = 3)]
public async Task<IActionResult> Create(Mod mod)
{
    //...
© www.soinside.com 2019 - 2024. All rights reserved.