【问题标题】:Why we need to use @using with Html.BeginForm为什么我们需要在 Html.BeginForm 中使用 @using
【发布时间】:2017-01-20 09:58:10
【问题描述】:

谁能解释一下为什么我们需要使用

@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();}

【问题讨论】:

  • 即生成对应的结束标签(本例为结束
    标签)
  • 我还不信,为什么要使用using关键字?
  • 结束标签的输出由dispose方法实现。如果不使用“使用”,您将不会有结束的“”标签。
  • 为什么不使用 'using' 关键字输出是“System.Web.Mvc.Html.MvcForm { ...”?我们还有结束标签 ?
  • @Souregi,您可以随时查看source code

标签: c# asp.net-mvc razor


【解决方案1】:

通过使用@using (Html.BeginForm("CheckUser", "Home", FormMethod.Post))

它会自动在您的页面中添加&lt;/form&gt;。您不需要关心关闭表单标签,如果有人忘记关闭表单,它可以防止意外问题。

@*<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”。
  • 像这样使用它@{Html.EndForm();}
  • 是的,我实际上使用了这个表单@{Html.EndForm();},@Html.EndForm 对我不起作用:)。但它仍然呈现“System.Web.Mvc.Html .MvcForm"
  • 你的开始表单语句也应该像@{Html.BeginForm(...)} 你能把你的html和这些助手一起粘贴到你的问题中吗?
  • 是的,您没有正确添加开始表单。再次检查我的答案中的用法并尝试
【解决方案2】:

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

该技巧基于IDisposable 接口,using 可以理解并在块结束后调用Dispose 方法。

从BeginForm 返回的类型的Dispose 实现实际上并没有释放任何东西。它只是将结束标记写入输出流。

【讨论】:

  • 我同意 - 它只是语法糖,用于了解表单的范围,以便关闭它。
【解决方案3】:

BeginForm 对IDisposible 模式的使用相当有趣(错误)!

从头开始,BeginForm 返回一个MvcForm 的实例。 MvcForm 实现了IDisposible 及其Dispose 方法...

[...] 在 Using 语句的末尾呈现结束标记。

(来源:https://msdn.microsoft.com/en-us/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 { ...”
  • @Souregi,BeginForm() 和 EndForm() 都需要包含在 @{ ... } 中,因为它们返回 void(Jamiec,我冒昧地编辑了您的答案以显示正确的语法- 并且EndForm() 确实存在:)
  • 为 Stephen Muecke 鼓掌,我现在很清楚 :)
猜你喜欢
  • 1970-01-01
  • 2019-06-09
  • 2011-07-05
  • 2016-02-01
  • 2016-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多