2012-07-25 40 views
19

MVC3中Html.BeginForm的用法是什么? 为什么我们使用它,当我们可以直接添加一个表单标签时,这个html助手是否添加了一些功能或做了一些无法用简单的表单标签完成的功能。MVC3中Html.BeginForm的用法

回答

29

Html.BeginForm辅助方法包含一个couple overloads,其目的是使书写路由表单更容易。它意识到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是稍显不便,从剃刀拨打:

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

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

+0

这里使用的意思是什么,它与在asp.net中使用结构有关,用于包装IDisposable对象? – Charu 2012-07-25 08:02:02

+0

我在答案中添加了一段。 – Kivin 2012-07-25 08:11:45

4

当然你也可以手工编写代码,但它确实有几个优点,如:

  • 它返回一个对象,它是一次性的,这样就可以把它放在一个using条款,它会关闭窗体标签为您
  • 它计算的URL的形式操作
4

做一些事情,不能用简单的形式来完成

最后,每个辅助方法调用都转换为纯HTML,因此没有什么Html.BeginForm可以做到的,但不能通过直接使用<form>标签来完成。

Html.BeginForm纯属辅助方法。

2

有帮手的目的是什么? (修辞问题)你也可以手动输入所有输入,但帮手......好吧,有时候会帮助你。

它把它放在标签。是的,你可以做手工,或者你可以多一点幻想和做到这一点:

@using(Html.BeginForm()) 
{ 
} 

这将关闭表单标签为你。因此,如果您将所有输入保留在曲线括号内,则不必担心记住关闭表单标记。

+1

问题是*什么时候会有帮助。忘记关闭标签就像忘记关闭大括号一样 - 所以有什么意义? – John 2014-11-05 09:18:38

0

优秀的问题,我很想知道我自己。

我可能是错的,但这里是我的猜测(一个更好的人可以指正):

在MVC的初期,没有刮胡子。

C#/ VB和html之间的切换很难在语法上进行切换,所以推动了最小化这些边界。

创建表单时,有人发现纯粹在C#/ VB一侧创建整个表单,没有任何混合的手动html,只能有一个边界到周围的html世界。

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