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 方法并将其转换为使用的 HtmlHelperViewContext.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 回答