2009-06-18 32 views
3

これは私にとって非常に難しい課題です。私たちは既存のASP.NET Webサイトを利用して、PLのみをMVCに変換しています。私たちのサイトは非常に複雑です。しかし、難しいのは、既存のカスタムコントロールをMVCに変換することです。カスタムコントロール(私はユーザーコントロールについては言及していません)はもちろんSystem.Web.UI.Controlを継承し、そのオブジェクトを一貫して使用するクラスです。たとえば、次のような既存のカスタムクラスの上部にいくつかのプロパティがあります。従来のASP.NETカスタムコントロールをMVCに変換

Dictionary<int, Control> configControls; 
DropDownList kControl; 
CheckBox confirmBox; 

これらはすべて従来のASP.NETのタイプのWebコントロールの変数です。

だから私は何かが(最初から新しいカスタムコントロールを構築せずに)何ができるのか分かりましたが、HtmlHelperオブジェクトを使用することです。だから私はこれを試してみました:

(最初に私たちの新しいWebプロジェクトで私の新しいカスタムクラスの最上部にSystem.Web.MVC.Htmlを含んで使用して文を含める)

プライベートHtmlHelperのヘルパーを。 ディクショナリのconfigControls。 helper.DropDownList

これは機能しません。私はこのオブジェクトをこのように使うことはできないと思う?私は辞書でHtmlHelperを使用して、ヘルパーから変数型を外すことができると考えました。これらは単なる拡張メソッドであり、オブジェクトではありません。

私は古典的なASP.NETなどから継承することができた汎用の "コントロール"のようなものには対応していません。確かに、MVC obviusly(ステートレスで完全に異なる方法)ではなく、MVCで同じコンセプトのものを使うことができますか?

だから私は何かが(最初から新しいカスタムコントロールを構築せずに)何ができるのか分かりましたが、HtmlHelperオブジェクトを使用することです。 (最初に私たちの新しいWebプロジェクトで私の新しいカスタムクラスの最上部にSystem.Web.MVC.Htmlを含んで使用して文を含める)

private HtmlHelper helper; 
Dictionary configControls; 
helper.DropDownList 

が、これは動作していない。だから私はこれを試してみました。このアプローチがカスタムコントロールで機能するかどうかはわかりません。ヘルパー変数を使用しようとすると、署名にHtmlHelperパラメータが渡されている既存の拡張メソッドの内部にある場合を除き、拡張メソッドはありません。そのため、私のカスタムクラスの外部にあるprivate変数を作成すると、ヘルパーをするときから選択するインテリセンス。だから私はこのようなオブジェクトを定義する必要がありますか?

private HtmlHelper htmlHelper = new HtmlHelper(); 

しかし、ViewContextとIViewDataContainerをparamsとして要求しています。私は、このカスタムクラスにHMTLの文字列を作成してExtensionメソッドに渡して最終的にフィールドを吐き出すため、そのビューについては何も知らないカスタムメソッドを構築しています(これは必要ありません)。多分私はこのようなカスタムクラスでこのようにHtmlHelperを使用することはできません。

「コントロール」の代わりにそのオブジェクトを使用できますか?たぶん私は辞書の変数でも、コントロールの代わりに型オブジェクトを使うことができますか?私は知らないし、辞書からその値を参照または参照する必要があるときに、オブジェクトをHtmlHelperとタイプするようにキャストしますか?しかし、今は、辞書でHtmlHelperオブジェクトを使用して、ヘルパーの変数型をオフにできると考えました。しかし、それらは単なる拡張メソッドであり、オブジェクトではありません。

あなたがこれを読んだとき、私はここに何か意味があると思います。

+2

私は "Classic ASP.net"を見るのが大好きです:) – Hugoware

+0

これを指摘してくれてありがとう。私はこの質問についてとても奇妙なことを理解できませんでした。 :) –

答えて

0

私は必要なビジネスロジックを作成し、部分的なビューを共有しています(おそらく、かなりの構造化されたjavascript行が添付されています)。

次に、このコードをpartial requestという手法で使用します。

+0

それを読んだ後に把握するための厳しいコンセプト。私はどのようにそれがカスタムコントロールで私を助けてくれるのかわかりません。私は、HTMLのストリングとコントロールを最終的にビューに出力するメソッドを作成しています。この場合、私は実際に部分的な視野を必要としません。私はここでカスタムクラスについて話しています。フォーム全体を動的に表現し生成するhtmlの文字列を返すメソッド。 – PositiveGuy

+0

私はここでは同じ波長にいるとは思わない – PositiveGuy

+0

あなたが何を描いているのかは助手になるでしょう。ヘルパーは、静的クラスの静的メソッドであり、指定されたパラメータに基づいてマークアップを返します。 –

0

これは

Custom controls everywhere

はまたカタルシスプロジェクト Web-Application Framework - Catharsis - Part I - New Solution

CodePlexのを見て助けになるが、、ブログの記事のこのシリーズを見ているでしょうどのくらいわかりません同じもののURLは Catharsis

です。このプロジェクトには、asp.net mvcのコントロールの作成例があります。

+0

そうですが、私たちがここに必要としているもののために外に出ています。私はこのようなカスタムコントロールをすべて作成したくありません。私はちょうどHTMLを吐き出し、私のカスタムコントロールから私たちの動的なWebフォーム用のHTMLを作成したいと思います。フィールドの種類ごとにHTMLを動的に生成するために、他のカスタムコントロールのshitloadを作成する必要がないことを願っています。カスタムコントロールを生成し、HTML文字列として拡張メソッドに返す必要があります。 – PositiveGuy

+0

これを行うためにサードパーティのフレームワークを使用することには興味がありません.M MVCのバニラオブジェクトを使用するだけで独自のカスタムコードを制御したいと考えています。 – PositiveGuy

+0

probsはありません。私はそれがオープンソースであり、asp.net mvcのカスタムコントロールに関していくつかの設計アイディアを持っているので、そのフレームワークを指摘しました。 もう1つは、開発中の特定のアプローチ(ある種の再利用可能なUIフレームワーク)を採用するかもしれないプロジェクトに依存しますが、それは依存しています。 コメントありがとうございます。 –

4

私はこの昨晩についてブログに書きましたが、このうちのいくつかはあなたにとって役に立つかもしれません。

WebForms And MVC In Harmony — Almost…

基本的にはMVCを使用して、 "WebBrowserコントロール" をエミュレートするためのいくつかのオプションについて説明します。

さらに、以前と同じようにWebControlsを使用することもできます(ViewStateのようなものが必要な場合は機能しない可能性があります)。私が発見した問題は、インラインレンダーコードとWebControls自体から切断されていることです。

私は昨夜、このメソッドを作成して、インラインコードでWebControlを使用させました。

using System.Reflection; 
using System.IO; 
using System.Web.UI; 
using System.Web; 
using System.Web.Mvc; 

public static class MyExtensionMethods { 

//example method - renders a webcontrol to the page 
public static void RenderControl(this HtmlHelper helper, Control control) { 

    //perform databinding if needed 
    MethodInfo bind = control.GetType().GetMethod("DataBind"); 
    if (bind is System.Reflection.MethodInfo) { 
     bind.Invoke(control, null); 
    } 

    //render the HTML for this control 
    StringWriter writer = new StringWriter(); 
    HtmlTextWriter html = new HtmlTextWriter(writer); 
    control.RenderControl(html); 

    //write the output 
    HttpContext.Current.Response.Write(writer.ToString()); 

    //and cleanup the writers 
    html.Dispose(); 
    writer.Dispose(); 
} 

} 

//then used like... 
<% int[] numbers = { 1, 2, 3, 4, 5 }; %> 
<% this.Html.RenderControl(new DataGrid() { DataSource = numbers }); %> 

ただ、面白いコンセプトはあなたが興味があるかもしれません。あなたのMVCアプリケーションにWebフォームコントロールをハッキングの

+1

本当にありがとうございます。複雑なshiza。 – PositiveGuy

+0

賢いですが、それはハックです。 :) –

+1

私は議論しません - :) – Hugoware

2

ショート、多くの方法でservercontrolsはMVCにマップされません。

パーシャルとコントローラ(またはそのようなものが好きな場合はサブコントローラ)に置き換えられます。

いくつかのパラメータに基づいていくつかのHTMLをレンダリングするだけであれば、ヘルパーはあなたの後になります。静的クラス、静的メソッド。しかし、状態を保持し、ステートフルなものをたくさん用意する必要がある場合は、部分、JS、コントローラ(またはサブコントローラ)が本当に後になっているのです。

実際に自分の状態を管理するサーバーコントロールは、過去のMVCのものです。

MVCは、特に写真にRESTを取り込んだ場合に、ウェブを使いたいと思った方法でウェブを使用しようとしていることを覚えておいてください。 Webformsは、WindowsフォームのようなWebを動作させるためのファッジです。

+0

私は同じウェブは結局は無国籍だと思います。しかし、coffeaddictはそうしなければならない。 –

+0

さて、私は完全に理解していますが、HTMLを私の視点に吐き出したいのですが、なぜこれを行うには部分的かJavaScriptが必要かわかりません。私が望むのは、私が持っていたカスタムコントロールをステートレスに再現して、そのHTMLをExtensionメソッドの上流に渡すことだけです。次に、使用可能なコントローラ内のコンテキスト(ControllerContext、ViewContextなど)を使用して状態を維持します。 – PositiveGuy

+1

あなたがやりたいことがHTMLを吐き出すのであれば、JSや何か他のものを使う必要があると言っているわけではありません。それは正確にヘルパーです。あなたのカスタムコントロールが正確に何をしているかわからなければ、これは私が提供できる最も完全な答えです。 –

関連する問題