C# BeginForm生成一个id为的表单操作
此代码:C# BeginForm生成一个id为的表单操作,c#,.net,asp.net-mvc,asp.net-mvc-4,razor,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"> } 当
@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">
}
当我尝试提交MVC投诉表时:
System.ArgumentException:参数字典包含空值
不可为空的类型为“System.Int32”的参数“id”的条目,用于
方法'System.Web.Mvc.ActionResult板(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">
}
@使用(Html.BeginForm())
{
@LabelFor(x=>x.Name);
@EditorFor(x=>x.Name);
}
这实际上仍然会生成与您现在拥有的相同的URL来发布:
<form action="/Board/Rename/43" method="post">
至于为什么您会失败,我怀疑model binder会与URL中的ID参数以及表单中的ID参数混淆。至于“正确的方法”,通常除非我需要给表单一个Id(或类)或需要发布到不同的操作方法,否则我使用上面所示的基本构造函数。这有一个很好的效果,即能够在多个位置重用此表单来自的View(),而无需在ViewModel中传递控制器、操作集和值 该死,那很容易。。。谢谢你必须再等7分钟才能得到“接受”:)没问题——我现在正在做一个项目重写,表单重用真是天赐良机!
@using (Html.BeginForm())
{
@Html.LabelFor(x => x.Name);
@Html.EditorFor(x => x.Name);
<br/>
<input type="submit" value="@Labels.Submit">
}
<form action="/Board/Rename/43" method="post">