无法从通用处理程序访问用户控件公共属性

时间:2014-08-18 07:45:03

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

以下是我的通用处理程序代码。此代码编译并将名为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
        }
    }
}

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

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

将一个usercontrol实例添加到一个asp.net页面实例&#34;没有一个表单&#34;将导致类似于下面的错误。 enter image description here

解决方法是推导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。这样您就可以轻松理解命名空间层次结构。