6

これは少しばかげた試みのように思えるかもしれませんが、それでも私が学びたいことです.

現在、ASP.NET MVC 3.0 では、構文を使用する必要があり@using (Html.BeginForm()) {、その後}、フォーム ブロックを閉じて、手の込んだ新しい「邪魔にならない JavaScript」を取得する必要があります。 )。

どういうわけか ( Read: *OCD*) 私はそれが好きではありません。本当はこうしたほうが..

@Html.BeginForm()
<div class="happy-css">
</div>
@Html.EndForm()

まだ愚かに見えますか?ええ、まあ、それぞれに。なぜそれがどのように機能しているのかを理解し、自分の好みに合わせて成形したい. そのため、最初に掘り始めるのは MVC 3.0 ソース自体だと思いました。そこで、コードプレックスに飛び込んでBeginFormExtension メソッドを見つけました。

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

だから今、私は自分の目標を達成する方法について少し混乱しています. コードを読んでみると、それらはすべてルート メソッドになっていることがわかりました (ほとんどの拡張メソッドは、冗長性を避けるためにすべてが 1 つのメソッドに到達する階層的なメソッドであるように見えるため、当然のことです)。

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

ここで見ていないのは、このメソッドが目立たない JavaScript にどのように関連しているかです。単純に入力すると..

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

そして、私の検証をそのように入れます...

@Html.ValidationSummary(false)

目立たないjavascriptを取得しません。しかし、私が使用する場合

@using (Html.BeginForm()) {それから私はします。生成されたマークアップも調べましたが、実際には違いがわかりません。

さて、それは奇妙になります。入力するだけで...

@Html.BeginForm()次に、すべてのフォーム コードを入力すると、フォームが機能し、目立たない JavaScript が表示さ</form>れますが、最後に手動で入力する必要があります。@Html.EndForm()動作しません。しかし、それに加えて、 HTMLSystem.Web.Mvc.Html.MvcFormのすぐ下の出力ストリームにテキストが書き込まれるようになりました。<form action="/Controller/Action" method="post">

誰かが私を啓発および/または助けてくれますか?

4

2 に答える 2

8

根本的な質問 (つまり、BeginForm/EndForm 構文の使用方法) に対する答えは、次の方法で行うことです。

@{ Html.BeginForm(...); }
<div> content</div>
@{ Html.EndForm(); }

残念ながら、現在の 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("");
}
于 2011-02-23T16:34:24.530 に答える
0

それが機能する理由は、BeginForm メソッドが html ではなく MvcForm オブジェクトを返し、html をページに直接書き込むためだと思います。using ブロックが終了すると破棄され、終了終了タグが書き込まれます。System.Web.Mvc.Html.MvcFormこれが、出力にテキストが表示される理由です。MvcForm オブジェクトは破棄されないため、終了タグを手動で配置する必要があります。

using 構文は次のようになります。

@{ MvcForm mf = Html.BeginForm(); /* writes directly to html stream */ }
<div class="happy-css">
</div>
@{ mf.Dispose(); /* like calling mf.EndForm() */ }
于 2011-05-16T09:13:38.657 に答える