【问题标题】:url routing with strongly typed objects具有强类型对象的 url 路由
【发布时间】:2011-06-06 03:16:02
【问题描述】:

我正在尝试为页面创建具有强类型对象的 url 路由,但我在第一行不断收到空对象,所以它崩溃了

//Getting the suitable executing Page
var display = BuildManager.CreateInstanceFromVirtualPath(_virtualPath,typeof(Page)) as IProfileHandler;
//Setting Page Parameters
display.MemberId = Convert.ToInt32(requestContext.RouteData.Values["ID"]);
//Return Page
return display;

public interface IProfileHandler : IHttpHandler
{
    int MemberId
    {
        get;
        set;
    }
}

【问题讨论】:

  • 哪个对象为空?显示或请求上下文?如果是显示,调试时是构建管理器返回一个对象,但它不是 IProfileHandler 类型?
  • display 为 null ,当我投射到 iprofilehandler 时它返回 null ,当我投射到 ihttphandler 时它返回指定的对象

标签: c# asp.net url routing


【解决方案1】:

对于那些路过这里的人,这就是我所做的,我在我的页面类中添加了一些属性,并且我正在转换到该类,这似乎是个好主意。

【讨论】:

    【解决方案2】:

    CreateInstanceFromVirtualPath 未返回实现 IProfileHandler 的对象。

    编辑:

    您正在尝试将返回对象强制转换为 IProfileHandler。这意味着你说“好的编译器,我知道这个方法返回一个object,但我保证它已经是一个实现IProfileHandler 的实例。”由于CreateInstanceFromVirtualPath 方法是在您不知道您的自定义类的情况下创建的,因此它无法返回一个保证遵循您的自定义接口设置的约定的对象(具有属性int MemberId)。因为无法正确转换对象并且您使用的是as 运算符,所以您将获得空值。如果你进行了正常的演员表,InvalidCastException 会被抛出。

    我不确定我是否适合回答您如何实现它,因为我从未使用 HttpHandlers 做过任何工作,但根据 this documentation 看来您会创建一个类实现 IHttpHandler,修改您的 web.config 以使用新的处理程序,然后将其转换为您的新类。也许像

    public class ProfileHttpHandler: IHttpHandler
    {
        public int MemberId { get; set; }
    
        public bool IsReusable
        {
            get
            {
                // return value here
            }
        }
    
        public void ProcessRequest(HttpContext context)
        {
            // custom request processing here
        }
    }
    

    带有一个 web.config 条目

    <configuration>
       <system.web>
          <httpHandlers>
             <add verb="*" path="*.yourIntendedExtension" type="FQN, Assembly" />
          </httpHandlers>
       </system.web>
    </configuration>
    

    【讨论】:

    • 它返回一个实现 ihttphandler 的对象,我正在创建一个实现 iprofilehandler 的接口,为什么它不起作用?!?如果它不起作用,我应该使用什么方法?
    • @user510336...试着再读一遍那句话(一次又一次)...现在,回答我。这两个类有什么共同点?...现在,您可以强制转换为 THAT THEY HAVE IN COMMON,仅此而已。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 2016-09-02
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多