7

divに欠落しているすべての要素を表示するカスタム検証セットを作成しています。そのdivを書き出すカスタムメソッドを使用できるようにしたいの@Html.BeginForm()ですが、このナットはタグまたは文字列を書き出す単なるhtml拡張機能よりも少し難しいため、どこから始めればよいのかよくわかりません。 (フォームはデータ/コントロールをカプセル化}し、最後に閉じられます)。

組み込みメソッドのメタデータバージョンを調べましたが、BeginForm()あまり役に立ちませんでした。基本的に、可能であればそのメソッドを拡張して、JavaScriptから表示/非表示にするMvcHtmlStringのを書き出してもらいたいだけです。div

最終的に私が苦労しているのは、開始コンポーネントと終了コンポーネントを含むこのカスタムヘルパーの作成方法を理解することです。

@using(Html.BeginForm())
{
...

}

私はこのようなことをしたいと思っています:

@using(Html.VBeginForm())
{
...

}

そしてそれは私の余分なhtmlをレンダリングします

編集:以下の提案からコードを追加

public class VBeginForm : IDisposable
{
    private readonly HtmlHelper _helper;
    public VBeginForm(HtmlHelper htmlHelper, string areaName)
    {
        _helper = htmlHelper;
        var container = new TagBuilder("form");
        container.GenerateId(areaName);
        var writer = _helper.ViewContext.Writer;
        writer.Write(container.ToString(TagRenderMode.StartTag));
    }

    public void Dispose()
    {
        _helper.ViewContext.Writer.Write("</form>");
    }
}
4

2 に答える 2

6

HtmlHelperに出力するクラスの拡張メソッドを記述する必要がありますhelper.ViewContext.Writer

IDisposableメソッドは、メソッド内の終了タグを出力するを返す必要がありDisposeます。

于 2011-06-17T14:38:03.410 に答える
4

SLaks の回答は正しいですが、追加情報が不足しています。

従来の (目立たない) クライアント側の検証を使用する場合は、クライアント側の検証が機能するように、formContext を指定して ID を指定する必要があります。彼の説明では、この部分が欠けています。

これを実現する最も簡単な方法は、 return を使用してMvcFormクラスのインスタンスを作成し、 を作成してインターフェイスformContextを実装することです。IDisposable

この実装では、フォームの ID を提供する必要がありました。

public static MvcForm BeginFormDatosAdicionales(this HtmlHelper htmlHelper, 
   string id, ..., IDictionary<string, object> htmlAttributes = null)
{
  TagBuilder form = new TagBuilder("form");
  // attributes
  form.MergeAttributes(htmlAttributes);
  // action
  string formAction = ...;
  form.MergeAttribute("action", formAction);
  // method
  FormMethod method = ...;
  form.MergeAttribute("method", HtmlHelper.GetFormMethodString(method), true);
  // id
  form.MergeAttribute("id", id);

  // writes the form's opening tag in the ViewContext.Writer
  htmlHelper.ViewContext.Writer.Write(form.ToString(TagRenderMode.StartTag));

  // creates an MvcForm (disposable), which creates a FormContext, needed for
  // client-side validation. You need to supply and id for it
  MvcForm theForm = new MvcForm(htmlHelper.ViewContext);
  htmlHelper.ViewContext.FormContext.FormId = form.Attributes["id"];

  // The returned object implements IDisposable, and writes the closing form tag
  return theForm;
  }

もちろん、これは特定のケースに合わせてカスタマイズできます。絶対に必要な場合にのみフォームに ID を提供したい場合は、次の条件を確認してください。

bool idRequired = htmlHelper.ViewContext.ClientValidationEnabled
&& !htmlHelper.ViewContext.UnobtrusiveJavaScriptEnabled;

この場合、ページ内のフォームごとに異なる ID を作成するように注意する必要があります。たとえば、整数のサフィックスを追加できます。これは HttpContext.Items に格納でき、新しい Id が生成されるたびにインクリメントされます。これにより、1 つのページで生成されるすべての ID が異なることが保証されます。

HttpContext.Current.Items["lastFormId"]
于 2013-07-31T09:04:26.397 に答える