c# - BeginForm 生成一个带有 id 的表单操作

标签 c# .net asp.net-mvc asp.net-mvc-4 razor

这段代码:

@using (Html.BeginForm("Rename", "Board", FormMethod.Post))
{
    @Html.LabelFor(x => x.Name);
    @Html.EditorFor(x => x.Name);
    @Html.HiddenFor(x => x.Id);
    <br/>
    <input type="submit" value="@Labels.Submit">
}

生成以下 html:

<form action="/Board/Rename/43" method="post"> // **take a look here**
    <label for="Name">Name</label>
    <input class="text-box single-line" id="Name" name="Name" type="text" value="Board 3" />
    <input data-val="true" data-val-number="The field Id must be a number." data-val-required="The Id field is required." id="Id" name="Id" type="hidden" value="43" />    
    <br/>
    <input type="submit" value="Submit">
</form>

我的行为是这样的:

public ActionResult Rename(int id)
{
    var board = _unitOfWork.Boards.GetById(id);
    return View(board);
}

[HttpPost]
public ActionResult Rename(int id, string name)
{
    _unitOfWork.Boards.Rename(id, name);
    _unitOfWork.Commit();
    return RedirectToAction("Board");
}

当我尝试提交 MVC 提示的表单时:

System.ArgumentException: The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult Board(Int32)

我猜这是因为生成的操作 url 的最后一部分(“/Board/Rename/43”)

怎样做才是对的?

最佳答案

您是对的,表单的 URL 生成将为您处理路由。这意味着,您实际上可以删除 Html.BeginForm() 参数和 ID 的隐藏值。

@using (Html.BeginForm())
{
    @Html.LabelFor(x => x.Name);
    @Html.EditorFor(x => x.Name);
    <br/>
    <input type="submit" value="@Labels.Submit">
}

这实际上仍然会生成相同的 URL 以发布到您现在拥有的 URL:

<form action="/Board/Rename/43" method="post">

至于为什么这对您来说失败了,我怀疑模型绑定(bind)器混淆了 URL 中的 ID 参数以及表单中的 ID 参数。至于“正确的方法”,通常除非我需要给表单一个 Id(或类)或需要发布到不同的操作方法,否则我使用如上所示的基本构造函数。这有一个很好的效果,即能够在多个地方重用此表单来自的 View(),而无需在 ViewModel 中传递 Controller 、操作值集。

关于c# - BeginForm 生成一个带有 id 的表单操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19695405/

相关文章:

c# - 如何使用 dotnet test 命令行运行单个 xunit C# 测试

Windows 窗体中的 C# 垂直标签

c# - 在 C# 中覆盖二元运算符

asp.net-mvc - 我应该实现 OpenID 身份验证吗?美国/日本用户

asp.net-mvc - ASP.NET MVC - 从另一个项目引用主/布局页面?

c# - 如何通过单独的组件配置WCF日志跟踪?

c# - 复杂的 Linq 分组

.net - 为什么 Windows\Assembly 中可能缺少 System.Threading.dll?

c# - 如何从 Zebra 收据打印机回读状态?

html - @Html.Raw 在 MVC4 和 IE8 中