为什么这不起作用?
在创建
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; }
}
如果我在浏览器 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)
{
//...