Asp.net mvc MVC路由问题中的IoC-Castle-Windsor

Asp.net mvc MVC路由问题中的IoC-Castle-Windsor,asp.net-mvc,castle-windsor,asp.net-mvc-routing,Asp.net Mvc,Castle Windsor,Asp.net Mvc Routing,我已经在mvc应用程序中设置了castle windsor。除了捕捉链接或图像类型的路由外,其他一切都很好。问题是,在退出控制器并生成视图GetControllerInstance之前,使用“null”类型执行。只要页面上有如下链接,就会发生这种情况: <link rel="stylesheet" type="text/css" href="non-existing.css"/> 或指向不存在的图像的链接。为什么会这样 我的windows类: public class Wi

我已经在mvc应用程序中设置了castle windsor。除了捕捉链接或图像类型的路由外,其他一切都很好。问题是,在退出控制器并生成视图GetControllerInstance之前,使用“null”类型执行。只要页面上有如下链接,就会发生这种情况:

<link rel="stylesheet" type="text/css" href="non-existing.css"/>
或指向不存在的图像的链接。为什么会这样

我的windows类:

    public class WindsorControllerFactory : DefaultControllerFactory
{
    #region Constants and Fields

    /// <summary>
    /// The container.
    /// </summary>
    private readonly WindsorContainer container;

    #endregion

    // The constructor:
    // 1. Sets up a new IoC container
    // 2. Registers all components specified in web.config
    // 3. Registers all controller types as components
    #region Constructors and Destructors

    /// <summary>
    /// Initializes a new instance of the <see cref="WindsorControllerFactory"/> class.
    /// </summary>
    public WindsorControllerFactory()
    {
        // Instantiate a container, taking configuration from web.config
        this.container = InversionOfControl.Container;

        // Also register all the controller types as transient
        IEnumerable<Type> controllerTypes = from t in Assembly.GetExecutingAssembly().GetTypes()
                                            where typeof(IController).IsAssignableFrom(t)
                                            select t;
        foreach (Type t in controllerTypes)
        {
            this.container.AddComponentLifeStyle(t.FullName, t, LifestyleType.Transient);
        }
    }

    #endregion

    #region Methods

    /// <summary>
    /// The get controller instance.
    /// </summary>
    /// <param name="requestContext">
    /// The request context.
    /// </param>
    /// <param name="controllerType">
    /// The controller type.
    /// </param>
    /// <returns>
    /// Resolved controller instance.
    /// </returns>
    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        if (controllerType == null)
        {
            controllerType = typeof(HomeController);
        }

        return (IController)this.container.Resolve(controllerType);
    }

    #endregion
}

这是很自然的。不存在的图像或css找不到控制器,但您将其默认设置为HomeController,而此控制器无法处理静态内容

我认为你不需要在这里设置超控。让默认控制器处理它所做的事情,如果找不到资源,则资源将得到404错误,而不是强制该控制器为其提供服务

正如我所说的,如果找不到类型,则类型自然为null。 将其更改为:

   if (controllerType == null)
    {
        return base.GetControllerInstance(requestContext, controllerType);

    }

我发现当controllerType为null时,我必须返回null。将其传递给基类会导致异常。下面是我正在使用的工作代码

public class DependencyControllerFactory : DefaultControllerFactory, IDisposable
{
    protected readonly WindsorContainer _container;

    public DependencyControllerFactory()
    {
        _container = new WindsorContainer();

        _container.Kernel.Resolver.AddSubResolver(new CollectionResolver(_container.Kernel));
        _container.Install(FromAssembly.This());
    }

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        if (controllerType == null)
        {
            return null;
        }
        else
        {
            return (IController)_container.Resolve(controllerType);
        }
    }

    public override void ReleaseController(IController controller)
    {
        _container.Release(controller);
    }

    public void Dispose()
    {
        _container.Dispose();
    }
}

我必须添加if station,因为不这样做会使我的应用程序崩溃。错误ArgumentNullException,因为找不到映像时类型为null。我认为这不应该发生在应用程序运行正常的情况下,除非在调试中,我发现路径“/asdf.css”的控制器未找到或未实现IController。这正常吗?是的,只要在fiddler中你看到请求得到404作为响应。好的,但这不是CSS,而是主页,对吗?在这种情况下,您的路线有问题。好的,太好了!很高兴听到这个消息。