1

現在のプロジェクトでは、ユーザーがアップロードされたPDFのサムネイルを表示できる機能を追加する必要があります。これを実現する便利なコンポーネントを見つけました(基本バージョンは無料ですが、現在のニーズには十分です)。とにかく、コントロールはかなり時代遅れ(2010)であるため、MVCサポートはないようです。デモでは、コントロールの使用法を次のように示しています。

ビューのマークアップ:

<form method="post" runat="server" enctype="multipart/form-data">
       <asp:Panel ID="thumbnailsPanel" runat="server" />
</form>

サムネイルコントロールはコードを介してインスタンス化され、サムネイルを表すバイト配列がコントロールに渡され、コントロールがに追加されます。thumbnailsPanel

<script runat="server">
protected void DisplayThumbs_Click( object sender, System.EventArgs e )
{
      Thumbnail thumbnail = new Thumbnail();
      thumbnail.SessionKey = sessionID;
      thumbnail.Index = i;
      thumbnailsPanel.Controls.Add( thumbnail );
}
</script>

かみそりのビューでコントロールを宣言できない場合Thumbnail、MVCでこのコントロールをどのように使用しますか?このコントロールMVCを役に立たないようにするために数時間を費やしました。私が思いついた最善の方法は、プロジェクトに.ASPXビュー(not.cshtml)を含め、そのビューにサムネイルコントロールをレンダリングすることです。明らかに、これは望ましくありません。

では、MVCでASPXサーバーコントロールをどのように使用しますか?アイデアは完全に悪いものであり、実践されるべきではありませんか?

4

1 に答える 1

3

私のプロジェクトでは、コントロールをHtmlHelperとして再実装することで、この問題を回避しました。コントロールがそれほど複雑ではないと仮定すると、それはあなたにとってもうまくいくはずです。これを行う:

  1. リフレクターを使用してコントロールのソースをダンプします
  2. ソースをマッサージして実際にコンパイルするようにします(Reflectorからのソースは通常すぐにはコンパイルされないため)
  3. コントロールの状態を特定します。状態をメンバープロパティから独自の新しいViewModelクラスのメンバーに変換します。
  4. Renderメソッドを見つけて、それを使用するHtmlHelperに変換します。ViewContext.Writer

例えば:

public class FooControl : Control {
    public String Message { get; set; }

    public override void Render(HtmlTextWriter wtr) {
        wtr.WriteLine("<p>");
        wtr.WriteLine( message );
        wtr.WriteLine("</p>");
    }
}

これになります:

public class FooViewModel {
    public String Message { get; set; }
}

// This method should exist in a static Extensions class for HtmlHelper
public static void Foo(this HtmlHelper html, FooViewModel model) {
    HtmlTextWriter wtr = html.ViewContext.Writer;
    wtr.WriteLine("<p>");
    wtr.WriteLine( model.Message );
    wtr.WriteLine("</p>");
}
于 2012-11-15T20:58:22.717 に答える