我需要在我的ASP.NET MVC Razor页面上添加一个表单。我更喜欢使用以下语法:
@using (Html.BeginForm())
{
}
然而,我需要在表单中添加几个属性。因此,最终的代码类似于以下内容:
@using (Html.BeginForm(null, null, FormMethod.Post, new { name = "value" }))
{
}
然而,这样做会产生一个不良副作用。如果该页面的请求中存在查询参数,则第一个表单在提交时将它们一起传递。然而,第二个版本则不会。
我真的不知道为什么`BeginForm()`不支持属性,但是否有一种简单的方法可以添加属性到`BeginForm()`并在提交表单时仍然传递任何查询参数呢?
编辑:经过调查,最好的解决方案似乎是像这样:
<form action="@Request.RawUrl" method="post" name="value">
</form>
然而,当使用此语法时,客户端验证被禁用。似乎在不使用更复杂和可能不可靠的结构的情况下,没有很好的解决方案。
IncrementFormCount
,DefaultFormIdGenerator
和FormHelper
是做什么的吗? - Jonathan Wood<form>
元素。DefaultFormIdGenerator
基本上通过将其计数存储在HttpContext中并在每次增加时递增来跟踪给定视图中呈现的表单数量。它基本上允许您拥有类似于form0、form1、form2等的表单ID,这被无侵入式客户端验证所使用。 - Darin Dimitrov@using (Html.BeginForm(HtmlHelper.AnonymousObjectToHtmlAttributes(new { @class = "form-horizontal" })))
,以避免与只接受路由值的BeginForm()
版本产生歧义。 - Jonathan Wood@using (Html.BeginForm(htmlAttributes: new { name = "value" }))
- Darin DimitrovHtmlHelper.AnonymousObjectToHtmlAttributes()
也返回类型为RouteValueDictionary
。这很奇怪。我发布的代码没有任何问题就编译通过了。但是你的版本更加简洁。 - Jonathan Wood