首页 > 解决方案 > 如何在Classic ASP.NET中实现UserControl的RenderPartial并将序列化结果发送到浏览器

问题描述

在 Classic ASP.NET 中有 LoadControl 方法。但是如果我以同样的方式创建 UserControl 的基类

public class RenderingControl : System.Web.UI.UserControl
{
    public string GetHtml(Type ControlType, int id1)
    {
        var page = new Page();
        var control = page.LoadControl(ControlType, new object[] { id1 });
        page.Controls.Add(control);
        return RenderControlToHtml(control);
    }

    string RenderControlToHtml(Control control)
    {
        var sb1 = new StringBuilder();
        control.RenderControl(new HtmlTextWriter(new StringWriter(sb1)));
        return sb1.ToString();
    }
}

(我所有的控件都是从基类派生的,带有额外的方法 GetHtml)

public partial class FilterStatus : RenderingControl
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
}

而不是尝试以相同的方式将此控件发送到浏览器

    [WebMethod()]
    public string Filters(string type, int id) {
        var X = new FilterStatus();
        return X.GetHtml(X.GetType(), id);
    }

我在浏览器中收到需要控制的完整页面。这在我的项目逻辑中是错误的。我只需要接收我的 UserControl(就像在 ASP.NET MVC 中工作的 RenderPartial 一样)。如何在经典 ASP.NET 中执行此操作?

标签: c#asp.net

解决方案


RenderPartial 与 ASP.NET 无关。因为 ASP.NET 是特殊事件的传送器,例如 PageLoad。我已经将 RenderPartial 实现为最简单的文本处理器

public class GetControl : IHttpHandler
{

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/html";
        try
        {
            string Fname = "";
            string Base = HttpContext.Current.Server.MapPath("~/Filters");
            switch (context.Request.QueryString["Filter"])
            {
                case "Status": Fname = "FilterStatus.htm"; break;
                ...
                default: return;
            }

            string HTML = System.IO.File.ReadAllText(System.IO.Path.Combine(Base, Fname));
            context.Response.Write(HTML.Replace("@", context.Request.QueryString["Id"]));
        }
        catch (Exception ex)
        {
            context.Response.Write(ex.Message);
        }

    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
} 

在此处输入图像描述


推荐阅读