自分の @html.beginfbrm()を転がす
-
29-10-2019 - |
質問
Divに欠落しているすべての要素を表示するカスタム検証セットを作成しています。カスタムを使用できるようになりたいです @Html.BeginForm()
そのdivを書き留める方法ですが、このナットはタグまたは文字列を書き出すHTML拡張機能よりも少し難しいので、どこから始めればいいのか本当にわかりません(フォームはデータ/コントロールをカプセル化し、閉じられています }
最後に)。
内蔵のメタデータバージョンを見ました BeginForm()
方法とそれは私にはあまり役に立ちませんでした。基本的に、可能であればその方法を拡張して、 MvcHtmlString
の div
それはJavaScriptからショー/非表示になります。
最終的に私が苦労しているところは、最初と終了コンポーネントを持つこのカスタムヘルパーを書く方法を考え出すことです。
@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>");
}
}
解決
の拡張メソッドを書く必要があります HtmlHelper
に印刷するクラス helper.ViewContext.Writer
.
メソッドはandを返す必要があります IDisposable
それはその中にクロージングタグを印刷します Dispose
方法。
他のヒント
Slaksの答えは正しいですが、いくつかの追加情報が欠けています。
従来の(目立たない)クライアント側の検証を使用する場合は、FormContextを提供し、IDを提供して、クライアント側の検証が機能するようにする必要があります。彼の説明では、この部分はありません。
これを達成する最も簡単な方法は、のインスタンスを返すことを使用することです 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"]