以下是我的通用处理程序代码。此代码编译并将名为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命名空间中添加通用处理程序类,但仍然存在相同的问题。请告诉我如何解决这个问题?
答案 0 :(得分:0)
最后我自己解决了。我通过右键单击解决方案资源管理器中的项目并选择&#34;转换为Web应用程序&#34;将项目转换为Web应用程序。它奏效了。 :)
答案 1 :(得分:0)
将一个usercontrol实例添加到一个asp.net页面实例&#34;没有一个表单&#34;将导致类似于下面的错误。
解决方法是推导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。这样您就可以轻松理解命名空间层次结构。