2011-08-02 11 views
0

私は実装しようとしているRazor Htmlヘルパーで特に興味深い問題があります。このヘルパーの目的は、System.Typeを受け入れ、そのTypeのプロパティと関連する属性からJQueryで検証可能なフォームを生成し、実行時に生成されたフォームの検証ルールとして使用されるJavaScript文字列を返すことです。私は@ Html.Raw()を繰り返し呼び出すことによってフォームを生成しています。プロパティと属性を反復処理しながらフォームを構築します。もともと、htmlヘルパーは、それを使用しようとしていた唯一のファイルの中に書かれていましたが、これは一般化されてよく使われるヘルパーなので、プロジェクトのApp_Codeフォルダに移動しました。MVC 3 Razor Htmlヘルパーからデータを取得

これは問題です。私は、このヘルパーがApp_Codeにあるときにヘルパーからデータを返すためにViewDataを利用できないことを発見しました。もともと、私には二人のヘルパーがいました。 1つはフォームを生成し、ViewDataのJavaScript文字列を取り除きます。もう1つは、同じJavaScript文字列を取得してクライアント側スクリプトブロックの文書に印刷します。私は、このヘルパーがフォームを生成するだけでなく、1回のパスでこのJavaScript文字列を与えるので、重複するO(n)の作業を行う必要はありません。

オリジナル擬似コード:

@helper MakeFormAndValidationRule(Type) 
{ 
    //generate form 
    //write form using @Html.Raw() 
    //generate validation rules simultaneously 
    //store validation rules in ViewData 
} 

@helper WriteValidationRules() 
{ 
    @Html.Raw(ViewData["rules"]); 
} 

<form> 
    MakeFormAndValidationRule(Type) 
</form> 
<script> 
    form.validate(@WriteValidationRules()) 
</script> 

質問:例これらの種類は、「ベストプラクティス」は何ですか?後で取得するために検証ルールをDOMに書き込んで、実行時にJQueryの魔法を使って引き出すことができますが、これを行うためのより良い、よりクリーンな方法があれば知りたいと思います。

答えて

0

ViewDataは、モデルの一部であり、RazorヘルパーではなくカスタムHTMLヘルパーを使用する必要があります。このような

何か:

public static MvcHtmlString MakeFormAndValidationRule<TModel>(this HtmlHelper<TModel> helper, Type type) 
{ 
    var viewData = helper.ViewData; 

    // Your code... 
} 

More info on custom HTML helpers.

また、私はあなたがヘルパーでフォーム全体と検証を生成する必要があるとは思いません。それはあまりにも多くの責任です。

代わりに、責任をcustom editor templateに分けることを検討してください。

関連する問題