为什么我们需要使用@using with Html.BeginForm

时间:2017-01-20 09:58:10

标签: c# asp.net-mvc razor

有人可以向我解释为什么我们需要使用

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

而不是:

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

@using在这里的主要目的是什么,据我所知,我只使用'使用'关键字,以确保对象在超出范围时立即处理。我有点困惑。

我问这个问题是因为@ Html.BeginForm会输出一个文本:" System.Web.Mvc.Html.MvcForm {"在呈现表单的内容之前。 并使用'使用'关键字此文字未呈现。

编辑:这是我的代码,用于呈现" 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 个答案:

答案 0 :(得分:3)

BeginFormIDisposible模式使用相当有趣(误用)!

从头开始,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(); }

我猜,他们做出的决定很笨重而且容易忘记。

答案 1 :(得分:3)

使用var temp = {}; var result = []; for (var i=0; i<serie_chart.length; i++) { var chart = serie_chart[i] var name = chart.name if(!temp[name]) { temp[name]=[]; result.push({'name': name, 'data': temp[name]}) } temp[name].push(chart.data); }

它会自动在您的页面中添加@using (Html.BeginForm("CheckUser", "Home", FormMethod.Post))。您不需要关心关闭表单标签,如果有人忘记关闭表单,它可以防止意外问题。

</form>

如果您想使用Html.EndForm(),请使用它,如下所示

@*<form>*@
    @using (Html.BeginForm("CheckUser", "Home", FormMethod.Post)) 
    {

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

原因:@{Html.BeginForm("CheckUser", "Home", FormMethod.Post);} //other form elements @{Html.EndForm();} 不返回任何内容(返回类型Html.EndForm()),它会在流上写入。如果您不使用void,则{}符号会从以下语句中返回某些内容,因此会使用@,结果为object.ToString()

答案 2 :(得分:3)

这是强制渲染表单的close标签的技巧。

这个技巧基于System.Web.Mvc.Html.MvcForm接口,IDisposable理解并用于在块结束后调用using方法。

Dispose返回的类型的Dispose实现实际上并未处置任何内容。它只是将结束标记写入输出流。