2009-06-06 12 views
15

特に、属性パラメータの設定時にHtmlヘルパーがC#ASP.NET MVCビューに与える影響の種類を知りたい彼らは全体的に持っている利点の(なぜそれらを使用する?)C#MVC:MVC HtmlヘルパーとビューのダイレクトHTMLのパフォーマンスと利点

をHtmlのヘルパーで:

<%= Html.TextBox("firstName", Model.FirstName, 
    new { @disabled = "disabled", @class = "myCssClass" }) %> 

直接HTML:

<input type="text" class="myCssClass" name="firstName" 
    disabled="disabled" text="<%= Model.FirstName %>"/> 

私はO 5〜15を含んでかなりの数のページを持っていますそのような入力。その上にHtmlヘルパーはフォームをレンダリングすることができます(Html.BeginForm()など)を考えると、20人以上のHtmlヘルパーコールが発生する可能性があります。それらのうちのいくつかは反射も使用していると思います。上記のような属性を無効にした場合などです。

これにはパフォーマンスに大きな影響はありませんか?なぜ、そのヘルパーを使うのがより良い習慣と考えられるのですか?誰かが私に良い理由を教えてください:)私はそれらを使用したいと思いますが、私は本当に彼らが持っているパフォーマンスの影響を恐れています。

Htmlヘルパーを使用すると本当に利点がありますか?

+1

非常に良い質問。 Htmlを使用すると、クライアントマシンが直接ロードされます。しかし、ヘルパーが静的メソッドを呼び出すと、サーバからの値がレンダリングされます。 –

答えて

12

リフレクションのオーバーヘッドは、人々が本当に心配しているものです。しかし、合成ベンチマークの外では、それはかなり退屈な話題になります!

実際のプロダクションアプリケーション(データベースに対してCRUD操作を行ったり、Webサービスを使用しているなど)では、htmlヘルパーを使用するオーバーヘッドは、そのような種類のオーバーヘッドに比べて重要ではありませんコンテキストスイッチ。

ViewData/Modelからのフォーム値の復元や検証サポートなど、HTMLヘルパーが提供するメリットを特に考慮する必要はありません。

ボトムライン:可能であればhtmlヘルパーを使用してください。回避する必要があるまれな制限に直面した場合は、常に正式なhtmlを使用できます。

+3

要するに、あらかじめ最適化しないでください! – womp

+3

これはポスターに関する質問には答えません。パフォーマンス/オーバーヘッドは「退屈な話題」ではないため、プロセスの仕組みだけでなく、最適化された効率的なコードを作成することも重要です。さらに、ポスターはCRUD操作に関してパフォーマンスについて尋ねなかったので、説明は無言で無意味です。 「特に利益を考慮して心配するものは本当にありません...」 - はい、利益に関係なく心配するものです。パフォーマンスを常にコーディングし、パフォーマンスが向上すれば、サーバーリソースとエンドユーザーが幸せになることを意味します。 –

0

HtmlHelpersには反映されません。最後のパラメータはオブジェクトでもディクショナリでもないので、値の参照はハッシュテーブル経由で行われ、リフレクションではありません。 HtmlHelperは、そのメソッドが安全で安全である点で優れています...必要に応じて入力がエンコードされ、必要に応じてセキュリティチェックが行われます.HtmlHelpersには、htmlレンダリング以外にもたくさんあります。

+0

IntelliSenseは明示的にリフレクションを設定します。オブジェクトhtmlAttributesを持つHtml.TextBoxの3番目のオーバーロードは、 "要素のHTML属性を含むオブジェクトです。属性は、オブジェクトのプロパティを調べることによってリフレクションによって取得されます。通常、オブジェクトイニシャライザ構文を使用して作成されます。 これは私が上の例で行ったこと、そしてHtml。*のすべての例の99%にあるものです。だから私は反射を使用していると思います。 自分でテストし、Html.TextBoxを追加して3番目のパラメータに移動します。 IntelliSenseは上記の正確なテキストを持ちます。 – Alex

+0

リフレクターから、属性が辞書内にあることに注意してください:private static string InputHelper(このHtmlHelper htmlHelper、InputType inputType、文字列名、オブジェクト値、bool useViewData、bool isChecked、bool setId、bool isExplicitValue、IDictionary htmlAttributes ) – jrista

+0

間違った署名:public static string TextBox(このHtmlHelper htmlHelper、文字列名、オブジェクト値、IDictionary <文字列、オブジェクト> htmlAttributes) – jrista

2

私はそれを両方の方法で行っており、パフォーマンスはほぼ同じようです。 Phil Haackによれば、ヘルパーはちょうどヘルパーであり、好きな場合はPlain Old HTMLと書くことができます。

ヘルパーがもっと安全であるとは確信していません...ウェブページで同じHTMLを使用していても...インテリセンスは何らかの理由でヘルパーでうまくいくようですいいです。

選択リストのループをスピンアップする必要がないので、ヘルパーとのドロップダウンが簡単です。隠されたフィールドやテキストボックス(とリンクも)は、普通のHTMLで行われた私の目の見栄えが良く、特にオブジェクトの初期化構文を避けることができるので、いくつかの属性を含んでいます。

プレーンHTMLは、jQuery(see here for an example)とよくマッチしているようです。プレーンHTMLは読みやすくなりました。

htmlに大きな構造体を注入したいときに便利なヘルパーメソッドがあると思います。数ヶ月でこれらの方法で豊かなウェブサイトを見つけることができ、あらゆる種類の機能をサポートします。 1行のコードでページにグラフを挿入できるとします。

0

コントローラのアクション(GETによって呼び出される)の結果は、良いパフォーマンスを達成するためにキャッシュされる必要があります。したがって、Viewの実行時間を心配する必要はありません。私の場合、HtmlHelperの実行時間がパフォーマンスのボトルネックになるかもしれない状況を想像するのは難しいです。

5

Htmlヘルパーの使用には本当に利点がありますか?

私がHtmlHelpersを使用する際に目にする最大の利点は、マークアップの抽象レイヤーを提供することです。将来的にマークアップの構造を変更したい場合は、すべてのビューを通過して手動で変更するのではなく、ヘルパーから生成された出力を変更するだけで済みます。

また、開発チームの一貫性を促進します。これらの開発者は、UIが基づいているマークアップ構造とCSSクラスの正確な詳細を知る必要はありません。

例として、私は現在Bootstrapに基づいて働く会社の新しいUIフレームワークを開発しています。私はさまざまなブートストラップコンポーネントの適切なマークアップクラスとCSSクラスを生成する一連のHtmlHelpersを作成しました。これはすべて、Fluent APIで実行されます。これは、開発者がBootstrapに必要とされる詳細な知識と、Intellisenseを利用できるという追加のメリットがなくても、使いやすいものです。

TelerikのKendo UIフレームワークは同じ概念に基づいています。コードサンプルのいくつかを見てみましょう。

リフレクションとパフォーマンスに関しては、いくつかのHtmlHelperメソッドに含まれる可能性のあるコールの数を考慮しても大丈夫です。理由は、postを参照してください。

関連する問題