为什么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
印在屏幕上。
答案 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; 有一些无效的论点。
补充参考:
答案 2 :(得分:1)
您的打印屏幕未上传,但是您收到此错误是因为您需要以分号结尾,例如 @ Html.BeginForm();
关于大括号,它是代码的模式。 @ Html.BeginForm将一个开始标记写入响应,@ Html.Label返回一个HTML标签元素,不需要打开和关闭大括号。
您不需要使用Begin和End。
你可以这样使用:
@using (Html.BeginForm())
{
// some other stuff....
<input type="submit" name="Submit" />
}
这样,关闭括号将执行EndForm作业。