在MVC 3.0中重写Html.BeginForm()并保持不引人注目的javascript

Cie*_*iel 6 html-helper unobtrusive-javascript html.beginform asp.net-mvc-3

这似乎是一种愚蠢的努力,但这是我想要学习的东西.

现在,在ASP.NET MVC 3.0中,你需要使用语法@using (Html.BeginForm()) {然后,}关闭一个表单块以获得新的'不引人注目的javascript',以免你想手工编写所有这些(这很好) ).

出于某种原因(Read: *OCD*)我不喜欢这样.我真的宁愿这样做..

@Html.BeginForm()
<div class="happy-css">
</div>
@Html.EndForm()
Run Code Online (Sandbox Code Playgroud)

好像傻了吗?是的,对每个人都很好.我想知道为什么它如何工作并根据自己的喜好塑造它.所以我认为我开始挖掘的第一个地方是MVC 3.0源代码本身.所以我跳进了codeplex来找到BeginFormExtension方法.

(http://aspnet.codeplex.com/SourceControl/changeset/view/63452#288009)

所以现在我对如何开始实现目标感到有些困惑.通过阅读代码,我发现它们都归结为根方法(这并不奇怪,因为大多数扩展方法似乎都是分层方法,所有这些方法都是为了避免冗余而分成单个方法).

private static MvcForm FormHelper(this HtmlHelper htmlHelper, string formAction, FormMethod method, IDictionary<string, object> htmlAttributes) {
            TagBuilder tagBuilder = new TagBuilder("form");
            tagBuilder.MergeAttributes(htmlAttributes);
            // action is implicitly generated, so htmlAttributes take precedence.
            tagBuilder.MergeAttribute("action", formAction);
            // method is an explicit parameter, so it takes precedence over the htmlAttributes.
            tagBuilder.MergeAttribute("method", HtmlHelper.GetFormMethodString(method), true);

            HttpResponseBase httpResponse = htmlHelper.ViewContext.HttpContext.Response;
            httpResponse.Write(tagBuilder.ToString(TagRenderMode.StartTag));
            return new MvcForm(htmlHelper.ViewContext.HttpContext.Response);
        }
Run Code Online (Sandbox Code Playgroud)

我在这里没有看到的是这种方法与不显眼的javascript有什么关系.如果我只是输入..

<form action="/Controller/Action" method="post">

然后像我这样进行验证......

@Html.ValidationSummary(false)

我没有得到不引人注目的JavaScript.但是,如果我使用

@using (Html.BeginForm()) {那我呢.我甚至检查了生成的标记,我真的找不到差异.

现在它变得奇怪了.如果我输入...

@Html.BeginForm()然后把我所有的表单代码,表单工作,我得到不引人注目的JavaScript,但我必须手动键入</form>最后.@Html.EndForm()不起作用.但最重要的是,我现在将文本System.Web.Mvc.Html.MvcForm写入<form action="/Controller/Action" method="post">html 下面的输出流.

有人可以启发和/或帮助我吗?

mar*_*ind 8

您的基本问题(即如何使用BeginForm/EndForm语法)的答案是以下列方式执行此操作:

@{ Html.BeginForm(...); }
<div> content</div>
@{ Html.EndForm(); }
Run Code Online (Sandbox Code Playgroud)

不幸的是,当调用写入输出的帮助程序时,Razor语法现在更加冗长(与大多数只返回html代码段的帮助程序相反).您可以通过编写自己的扩展方法来使这更容易:

public static IHtmlString FormBegin(this HtmlHelper helper, ...) {
    helper.BeginForm(...);
    return new HtmlString("");
}

public static IHtmlString FormEnd(this HtmlHelper helper) {
    helper.EndForm();
    return new HtmlString("");
}
Run Code Online (Sandbox Code Playgroud)