ASP.NET MVC を使用した Telerik コントロール:これは MVC モデルに違反しますか?
-
21-08-2019 - |
質問
使用します MVC 対応の Telerik コントロール ASP.NETでMVCがMVCモデルに違反しますか?
そうでない場合、HTMLの手動でコーディングする上でTeleRikコントロールを使用することには、どのようなパフォーマンスヒット(機能と開発速度)がありますか?
解決
私はそのデモを作成した人間なので、私の意見も共有できると思います。私によると、このサンプル アプリケーションは MVC 原則に違反していません。RadControls は、MVC アプリケーションの ViewState やポストバックに依存しません (生成された出力をチェックして自分の目で確認できます - __doPostBack や __VIEWSTATE はありません)。確かに、グリッドをバインドしたり、メニューにデータを入力したりするには、コードを記述する必要がありますが、それでもコードはビュー (ASPX) 内にあり、完全にプレゼンテーションに関連しています (繰り返しますが、これは単なる私の意見なので、間違っている可能性があります)。
実際にいくつかの制限があることにも言及しておく必要があります。組み込み機能の一部 (ポストバックに依存するもの) は MVC では動作しません。ただし、それらの解決には取り組みます。RadControls および ASP.NET MVC に関して特別な質問がある場合は、お気軽にサポート チケットまたはフォーラム スレッドを開いてください。
他のヒント
2 番目の質問、パフォーマンス ヒットと手動コーディングの場合、使用しているコントロールによって異なると思います。たとえば、Menu、TabStrip、PanelBar など、MVC で Telerik ナビゲーション コントロールのいずれかを使用すると、大量の手動コーディングを節約できます (メニュー/タブストリップなどはインタラクティブな機能 (ドロップダウン オプションなど) を提供するには、多くのクライアント側コードと、多くの複雑な CSS が必要です)。したがって、MVC の RadControls は、 -生産性- リッチな ASPNET アプリを構築するときに慣れています。
ポストバックに大きく依存するグリッドなどのより複雑なコントロールの場合は、主に提供されたスタイルの恩恵を受けます。MVC モデルに適合させるには、グリッドなどのコントロールはポストバック イベントを URL アクションに「変換」するためにかなりの量の「カスタム」コーディングを必要とするため、多くのコードを節約できない可能性があります。MVC グリッド テンプレート。ただし、スタイリングにかかる時間を大幅に節約でき、パフォーマンスの違いは無視できるはずです。
それが役立つことを願っています。
-トッド
これらは WebForms の PostBack モデルに依存しており、MVC ビューと互換性がないことは確かです。おそらくそれらが機能する方法を見つけることはできるでしょうが、それは MVC の原則に沿ったものではありません。必要に応じて、同じ Web サイト内で Web フォームと MVC ビューを組み合わせることもできますが、それはお勧めしません。
Telerik コントロールを使用すると失われるものは、MVC の利点のほとんどです。懸念事項の明確な分離、強化されたテスト容易性、より無駄のない HTML、よりクリーンなアーキテクチャ。最終的に Telerik が MVC 用のコントロールを搭載するようになるとしても、私は驚かないでしょう。現時点では、いくつかの共通コンポーネントを再利用する必要がある場合は、クライアント側の純粋な Javascript 実装か、手動でコーディングされた ViewUserControl のいずれかを検討します。
個人的には、MVC では現在の Telerik コントロールを使用しません。状況によっては機能すると思います(http://telerikwatch.com/2009/01/telerik-mvc-demo-app-now-available.html)、しかし、それらはかなりビューステート/ポストバック中心であると思います。Telerik を知っているので、彼らは MVC 互換バージョンをリリースする予定ですが、その前には多くの作業が必要なようです...
古い質問であることは承知していますが、 Telerik の ASP.NET MVC コントロール 日付ピッカー、グリッド、パネルバー、タブストリップなどの単なるコントロールです。これらは MVC に匹敵するものではありません フレームワーク. 。彼らが働きます 併せて と それ。あなたの質問から、あなたはそうではない、あるいは少なくとも した ではなく、MVC が実際に何であるかを理解してください。
混乱している可能性のある他の人のためにも説明しておきますが、MVC は モデル-ビュー-コントローラー. 。あります モデル, 、値の保存または取得に使用しているオブジェクトを表します。 ビュー, 、これらのオブジェクトの値を表示し、次を使用してそれらの値を設定するために使用できます。 コントロール, Telerik の日付ピッカー、グリッドなど、 コントローラ, 、ビューをレンダリングし、モデル要素と対話する関数が格納されています。モデルの更新に使用するコントロールは、MVC 準拠にするためにそのモデルと対話できる必要があります。そうしないと、そもそも MVC コントロールとしてアドバタイズできません。そのため、コントロールは MVC フレームワークで動作し、MVC フレームワークに「違反」しません。
以下は、モデルと組み合わせた datepicker コントロールの使用例の 1 つです。
ビュー:
@model MyViewModel
<%= Html.Kendo().DateTimePickerFor(model => model.ExpirationDate)
.Name("datetimepicker")
.Value(model.ExpirationDate)
%>
モデルの表示: (またはモデル)
public MyViewModel() {
public DateTime ExpirationDate { get; set; }
}
コントローラ:
public ActionResult Index(int id)
{
var data = dataContext.SomeTable.Where(e => e.ID == id).FirstOrDefault();
// return View(data); // this would allow you to use @model SomeTable
// in your view, and not require a ViewModel, but returns the whole
// record for the given ID
// ViewModels allow you flexibility in what you return
MyViewModel mvm = new MyViewModel();
mvm.ExpirationDate = data.ExpirationDate;
return View(mvm);
}
Telerik のデモを使用してコードをコーディングするには、(上に示したように) 特定のモデルと入力するデータに対して多くのコピー/ペーストとさまざまな小さな編集を行う必要があります。また、コントロールにはほとんどすべてが組み込まれているため、コードが大幅に少なくなり、フィルタリング、ページング、並べ替えなどの制作時間が大幅に短縮されます。 グリッド はすでに存在します - たとえば、次のように追加するだけでオンになります。 Filterable()
, 、フィルタリング用。たとえば、個々の DataColumn を作成して DataTable に追加し、それをグリッドにバインドして、個々の DataColumn を心配する必要がなくなります。 OnDataBound
イベント (まだ実行できますが、必要な操作は少なくなります)、グリッドをインスタンス化し、列を追加し、項目の作成、読み取り、更新、削除のためのコントローラー関数を設定し、グリッド上のプロパティを設定すれば完了です。 :
<%: Html.Kendo().Grid<Models.ViewModels.MyViewModel>()
.Name("grid")
.Columns(columns =>
{
columns.Bound(c => c.ExpirationDate).Format("MM/DD/YYYY");
})
.HtmlAttributes(new { style = "height: 380px;" })
.Scrollable()
.Sortable()
.Filterable()
.Pageable(pageable => pageable
.Refresh(true)
.PageSizes(true)
.ButtonCount(5))
.DataSource(dataSource => dataSource
.Ajax()
.Read(read => read.Action("Customers_Read", "Grid"))
.Create(create => create.Action("Customers_Create", "Grid"))
.Update(update=> update.Action("Customers_Update", "Grid"))
.Delete(delete => create.Action("Customers_Delete", "Grid"))
)
%>
「読み取り」は、次の最初の 2 行を読み取るだけで簡単です。 public ActionResult Index()
それらを上に置き、 public Customers_Read([DataSourceRequest] DataSourceRequest request) {}
を返す関数 data
として .ToDataSourceResult()
. 。更新は関数の最後の 3 行と似ています。モデルをインスタンス化し、グリッドから渡されたモデルの値をコピーして、次のようなことを行います。 dataContext.SaveChanges()
保存する。保存すると、グリッドは自動的に再度読み取りを行うため、最新の値が表示されます。データを再バインドするためにポストバックで他に何も実行する必要がないため、コードを記述する必要はありません。
より良いアイデアを得るために、ここにあるコード例を見てください。 http://demos.telerik.com/aspnet-mvc/