20

What is the use of Html.BeginForm in MVC3. Why do we use it, when we can just add a form tag directly, does this html helper add some capability or does something which cannot be done with a simple form tag.

4

5 回答 5

35

Html.BeginForm辅助方法包含几个重载,其目的是使编写路由表单更容易。它了解 MVC 结构并确保其针对控制器和动作。这只是一点语法糖:

<form method="post" action="@Url.Action(...)">

用微软的话来说:

ASP.NET MVC 框架包括帮助方法,这些方法提供了一种在视图中呈现 HTML 的简单方法。

当然,没有人让你使用它们。这只是一个偏好问题。事实上,在 MVC 的早期,许多 WebForms 开发人员庆祝他们从服务器控件 a-la<asp:TextBox>等人中获得了新的自由,并坚持手工编写所有内容。

强烈建议对表单字段使用帮助程序,因为它们知道表单验证之类的事情。Html.BeginForm只是为您提供了一种开始和完成表单的一致方式:

@using(Html.BeginForm())
{
    @Html.LabelFor(...)
    @Html.EditorFor(...)
}

Html.BeginForm返回一个IDisposable对象,允许您将其包装在 C#using语句中。退出时using,处置会Html.EndForm()自动为您调用。由于Html.EndForm返回void,从 Razor 调用有点不方便:

@Html.BeginForm()
<formStuff>
@{Html.EndForm();}

一个简单的@Html.EndForm()将变成Write(Html.EndForm()) -> Write(void),即编译时错误。

于 2012-07-25T07:50:37.543 回答
6

当然,您可以手动编写代码,但它确实有几个优点,例如:

  • 它返回一个一次性的对象,这样你就可以把它放在一个using子句中,它会为你关闭表单标签
  • 它计算表单操作的 URL
于 2012-07-25T07:50:48.833 回答
4

做一些简单的表格无法完成的事情

<form>最后,每个辅助方法调用都转换为纯 HTML,因此 Html.BeginForm 没有什么是直接使用标记无法完成的。

Html.BeginForm纯粹是一个辅助方法。

于 2012-07-25T07:52:22.107 回答
2

有帮手的目的到底是什么?(反问)您也可以手动输入所有输入,但是助手……嗯,有时会帮助您。

它所做的一切都放在标签上。是的,您可以手动完成,或者您可以更花哨地执行以下操作:

@using(Html.BeginForm())
{
}

这也会为您关闭表单标签。因此,如果您将所有输入保存在弯曲括号内,则无需担心记住关闭表单标签。

于 2012-07-25T07:52:29.503 回答
0

很好的问题,我自己也很想知道。

我可能是错的,但这是我的猜测(更好的人可能会纠正我):

在 MVC 的早期,没有剃刀。

在 C#/VB 和 html 之间切换在语法方面是困难的,因此推动了将这些边界最小化。

在创建表单时,完全在 C#/VB 端创建整个表单,没有任何混合的手动 html,只与周围的 html 世界有一个边界,这是有益的。

而且由于程序员经常从其他地方复制做事的风格,使用这些助手的做法一直存在,即使它们的好处随着剃刀的出现而消失了。

于 2014-11-05T09:26:58.043 回答