在MVC使用ASP.NET服务器控件?(Using ASP.NET Server Controls

2019-07-03 20:30发布

在我目前的项目,我需要增加一个功能,允许用户查看自己上传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在我的Razor视图控制,我将如何使用MVC这种控制? 我花了几个小时,试图使这种控制MVC友好无济于事,我已经拿出最好是在自己的项目一个.ASPX视图(not.cshtml)和渲染上查看缩略图控制。 显然,这是不可取的。

所以,你会怎样在MVC使用ASPX服务器控件? 的理念是一个坏的干脆不应该实行?

Answer 1:

我工作围绕它在我的项目通过重新实现控制作为的HtmlHelper。 假设控制是不是太复杂,那么它应该为你工作了。 做这个:

  1. 转储使用反射控制的源
  2. 按摩源,因此它实际上编译(从反射源通常不会编译直线距离)
  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>");
}


文章来源: Using ASP.NET Server Controls in MVC?