2011-06-17 3 views
7

divのすべての不足要素を表示するカスタム検証セットを作成しています。私はそのdivを書き出すカスタム@Html.BeginForm()メソッドを使用することができるようにしたいと思いますが、このナットはタグを書き出すhtml拡張子よりもちょっと難しいです文字列(フォームはデータ/コントロールをカプセル化し、最後は}で閉じます)。自分の@ Html.BeginfBrm()をローリング

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

最終的に私が苦労しているのは、このカスタムヘルパをどのように書くのかを理解することです。

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

} 
私はこのような何かを行うことができるようにしたいと思います

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

} 

をし、それは私の余分なHTMLレンダリング持っ

EDIT:

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>"); 
    } 
} 
の下の提案からのコードを追加します

答えて

6

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

このメソッドは、Disposeメソッドで終了タグを出力するIDisposableを返します。

+0

これは間違いなく正しい方向に私を始めました。私はIDisposibleビットで少し失われています。私は2つのメソッドでIDisposibleを拡張するクラスを作成しようとしました。最初にフォームタグを書き出すライターを使用し、2番目のメソッドは終了タグを書き込むためのdisposeメソッドでした。 VS2010はそのアプローチで何か好きではありません。実際に私のメソッドIDisposibleを返すあなたの答えで言う...その戻り値の型をdispose()メソッドで呼び出す方法はありますか。...残念ながらここで少し混乱しています。 –

+0

'using'ブロックは、ブロックの最後に置いたオブジェクトを' Dispose() 'します。 – SLaks

+0

そうですが、私はそれを取得しますが、私のメソッドには、レンダリングされた終了フォームタグであるべきであることをどのように書きますか? –

4

SLaks答えは正しいですが、いくつかの追加情報がありません。

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

これを達成する最も簡単な方法は、formContextを作成MvcFormクラスのインスタンスを返す使用することであり、IDisposableインタフェースを実装しています。これはあなたの特定のケースのためにカスタマイズすることができます。もちろん、

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を供給するために必要。あなたが唯一絶対neccesary、このcontidition確認したときに、フォームのIDを提供したい場合:この場合

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

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

HttpContext.Current.Items["lastFormId"] 
+0

素晴らしいコードのサンプルです。私のニーズは完璧です。 –

関連する問題