为什么Html.BeginForm需要包裹在花括号内?

时间:2018-05-17 20:50:21

标签: asp.net-mvc

为什么begin form需要包含在花括号中,如下所示:

@{Html.BeginForm();}
    // some other stuff....
    <input type="submit" name="Submit" />
@{ Html.EndForm();}

Vs以上。如果我只是想要一个标签,我可以简单地做:

@Html.Label("Hi")

当我尝试@Html.BeginForm()而没有花括号时,我只需要

  

System.Web.Mvc.Html.MvcForm

印在屏幕上。

3 个答案:

答案 0 :(得分:2)

  

Razor复合@using - 在C#中,using语句用于确保   对象被处置。在Razor中,使用相同的机制来创建   包含其他内容的HTML帮助程序。

这是一篇很好的Razor syntax reference文章,详细介绍了@using (Html.BeginForm())

的语法

答案 1 :(得分:2)

以下是BeginForm参考(强调我的)的评论部分的解释:

  

BeginForm方法呈现将由a处理的表单   控制器动作方法。

     

您可以在using块中使用此方法。在那种情况下,该方法   在使用块的末尾呈现结束</form>标记。

如果您在没有代码块或@Html.BeginForm()块的情况下调用using方法,则将其视为标准Razor表达式(HTML编码)并隐式调用ToString()方法,因此类型名称为{{1将显示而不是打开System.Web.Mvc.Html.MvcForm标记。

<form>阻止内部使用BeginForm时,它会在HTML输出中呈现打开using和关闭<form>标记,因此</form>阻止:

using

将转换为HTML输出,如下所示:

@using (Html.BeginForm())
{
    <input type="submit" name="Submit" />
}

请注意,<form> <input type="submit" name="Submit" /> </form> 会返回Html.BeginForm对象,该对象会自动调用IDisposable,因此在Html.EndForm()阻止后无需使用Html.EndForm()

第二个@Html.Label(...)帮助程序不需要代码块,因为它派生自返回using的{​​{1}}命名空间,它同时呈现System.Web.Mvc.HtmlHelper和{ {1}}同时标记。

作为旁注,如果您尝试使用MvcHtmlString外部代码块(包含<label>),则会抛出此异常,因为</label>@Html.EndForm()方法@{ ... }变成了编译时错误:

  

最佳重载方法匹配   &#39; System.Web.WebPages.WebPageExecutingBase.Write(System.Web.WebPages.HelperResult)&#39;   有一些无效的论点。

补充参考:

Razor Syntax Quick Reference

答案 2 :(得分:1)

您的打印屏幕未上传,但是您收到此错误是因为您需要以分号结尾,例如 @ Html.BeginForm();

关于大括号,它是代码的模式。 @ Html.BeginForm将一个开始标记写入响应,@ Html.Label返回一个HTML标签元素,不需要打开和关闭大括号。

您不需要使用Begin和End。

你可以这样使用:

@using (Html.BeginForm())
  {
     // some other stuff....
     <input type="submit" name="Submit" />
  }

这样,关闭括号将执行EndForm作业。