为什么我们需要在Html.BeginForm中使用@using?

4
有人能解释一下为什么我们需要使用“

”吗?
(注:这是一个HTML标签,用于结束段落的定义。)
@using (Html.BeginForm("CheckUser", "Home", FormMethod.Post))

替换为:

@Html.BeginForm("CheckUser", "Home", FormMethod.Post)

在这里使用 @using 的主要目的是什么?据我所知,我只是使用 "using" 关键字来确保对象一旦超出范围即可被释放。我有点困惑。
我之所以问这个问题,是因为 @Html.BeginForm 输出了一个文本:"System.Web.Mvc.Html.MvcForm {...}"在渲染表单内容之前。而通过使用 "using" 关键字,该文本不会被呈现。 以下是我的代码,用于呈现 "System.Web.Mvc.Html.MvcForm ..."。
@Html.BeginForm("CheckUser", "Home", FormMethod.Post)
    <label for="username">Username :</label>
    <input type="text" name="username" id="username" placeholder="username"/>

    <label for="password">Password :</label>
    <input type="password" name="password" id="password" placeholder="password"/>

    <input type="submit" value="Submit" />
@{Html.EndForm();}

3
请将文本从英语翻译成中文。仅返回已翻译的文本:即生成相应的闭合标签(在此情况下为闭合的<form>标签)。 - Thangadurai
我还不太确定,为什么我们需要使用using关键字? - Mehdi Souregi
3
闭合标签的输出是通过 dispose 方法实现的。如果不使用 'using',则不会有闭合的 '</form>' 标签。 - mstaessen
为什么没有使用“using”关键字,输出结果是“System.Web.Mvc.Html.MvcForm { ...”,而且我们还有闭合标签</form>? - Mehdi Souregi
1
@Souregi,您可以随时检查源代码 - user3559349
显示剩余3条评论
3个回答

3
BeginFormIDisposible 模式上有一个相当有趣的(误)使用方式!
从开始说起,BeginForm 返回一个实例对象MvcFormMvcForm 实现了 IDisposible 接口和其中的 Dispose 方法...

[...] 在 Using 语句结尾处呈现 closing 标记。

(来源:https://msdn.microsoft.com/zh-cn/library/system.web.mvc.html.mvcform.dispose(v=vs.118).aspx#M:System.Web.Mvc.Html.MvcForm.Dispose)

如果没有这样的实现,你将需要做一些类似以下内容的操作:

@{ Html.BeginForm("CheckUser", "Home", FormMethod.Post); }
<!-- form content here -->
@{ Html.EndForm(); }

他们认为这将会很笨重且容易被忘记。

感谢@{Html.EndForm();},这是我第一次听说它,但它仍然呈现为"System.Web.Mvc.Html.MvcForm { ..."。 - Mehdi Souregi
1
@Souregi,BeginForm()EndForm()都需要用@{ ... }包装,因为它们返回void(Jamiec,我修改了你的答案以显示正确的语法 - EndForm()确实存在 :) - user3559349
为Stephen Muecke点赞,现在我明白了 :) - Mehdi Souregi

3
通过使用@using (Html.BeginForm("CheckUser", "Home", FormMethod.Post)),它会自动在您的页面中添加</form>标记。您不需要担心关闭表单标记,并且它可以防止意外问题,如果有人忘记关闭表单。
@*<form>*@
    @using (Html.BeginForm("CheckUser", "Home", FormMethod.Post)) 
    {

    }@* </form> gets added automaticaly*@ 

如果你想使用Html.EndForm(),请按照以下方式使用。
@{Html.BeginForm("CheckUser", "Home", FormMethod.Post);}
//other form elements
@{Html.EndForm();}

原因: Html.EndForm()没有返回任何内容(返回类型为void),而是直接写入流中。如果您不使用{}@符号将期望从以下语句返回某些内容,因此它将使用object.ToString(),这会导致System.Web.Mvc.Html.MvcForm


我使用了@Html.EndForm,但在呈现表单内容之前仍会呈现“System.Web.Mvc.Html.MvcForm”。 - Mehdi Souregi
使用它的方式是这样的:@{Html.EndForm();} - K D
是的,实际上我使用了这个表单 @{Html.EndForm();},@Html.EndForm 对我来说不起作用 :)。但它仍然渲染为 "System.Web.Mvc.Html.MvcForm"。 - Mehdi Souregi
你的开始表单语句也应该像@{Html.BeginForm(...)}一样。 你能把你的HTML和这些帮助程序粘贴到你的问题中吗? - K D
是的,你没有正确添加“Begin form”。请再次检查我的答案中的用法并尝试。 - K D

3

这是一种强制渲染表单关闭标签的技巧。

这个技巧基于IDisposable接口,using语句理解并使用它来在块结束后调用Dispose方法。

BeginForm返回类型的Dispose实现实际上不会处理任何内容。它只是向输出流写入闭合标签。


我同意 - 这只是语法糖,用于了解您的表单范围,以便关闭它。 - PhillipH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接