【问题标题】:Unable to access user control public properties from generic handler无法从通用处理程序访问用户控制公共属性
【发布时间】:2014-08-18 07:45:02
【问题描述】:

以下是我的通用处理程序的代码。此代码编译并将名为 NavigationMenu.ascx 的用户控件转换为 HTML 并将其发送到调用页面:

<%@ WebHandler Language="C#" Class="GetMenu" %>

using System;
using System.Web;
using System.Web.Script.Serialization;


public class GetMenu : IHttpHandler
{

public void ProcessRequest(HttpContext context)
{
    //--some other code
    string markup = getUserControlMarkup(0);
    context.Response.Write(markup);
}
public string getUserControlMarkup(int menuType)
{
    System.IO.StringWriter writer = new System.IO.StringWriter();

    using (System.Web.UI.Page page = new System.Web.UI.Page())
    {
        System.Web.UI.UserControl userControl = null;
        userControl = (System.Web.UI.UserControl)page.LoadControl("~/user controls/NavigationMenu.ascx");

        Type type = userControl.GetType();
        page.Controls.Add(userControl);
        HttpContext.Current.Server.Execute(page, writer, false);
        return writer.ToString();
    }
}

public bool IsReusable
{
    get
    {
        return false;
    }
}

}

这是用户控件的设计代码:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="NavigationMenu.ascx.cs" Inherits="NM.user_controls_NavigationMenu"  %>
<!--Some html -->

以下是它的cs代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace NM
{
    public partial class user_controls_NavigationMenu : System.Web.UI.UserControl
    {
        public int menuType = -1;
        public int selectedItem = -1;
        protected void Page_Load(object sender, EventArgs e)
        {
            //Some code
        }
    }
}

现在我想从通用处理程序访问menuType 和selectedItem。我尝试像这样访问它们:

((NM.user_controls_NavigationMenu)userControl).menuType=0;

但 Visual Studio 无法找到 NM 命名空间。我尝试在 NM 命名空间中添加通用处理程序类,但同样的问题仍然存在。请告诉我如何解决这个问题?

【问题讨论】:

    标签: c# asp.net .net user-controls httphandler


    【解决方案1】:

    终于自己解决了。我通过右键单击解决方案资源管理器中的项目并选择“转换为 Web 应用程序”将我的项目转换为 Web 应用程序。它奏效了。 :)

    【讨论】:

      【解决方案2】:

      将用户控件实例添加到“没有表单”的 asp.net 页面实例将导致类似于以下错误。

      解决方案是派生Page 类和override VerifyRenderingInServerForm 方法。

      public class FormlessPage : Page
      {
          public override void VerifyRenderingInServerForm(Control control)
          {
          }
      }
      

      用上面的类替换Page。

      var pageHolder = new FormlessPage();
      pageHolder.Controls.Add(pageHolder.LoadControl(path));
      

      至于 VS 的主要问题不允许您引用 UserControl 类,请打开类视图并找到 usercontrol。这样您就可以轻松理解命名空间层次结构。

      【讨论】:

        猜你喜欢
        • 2011-01-11
        • 1970-01-01
        • 2012-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多