I have created a Custom MVC route, via this article. When i build and run application via Visual Studio i get the YSOD with the following error
Unable to resolve type: dummy.Controllers.HomeController, service name:
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.InvalidOperationException: Unable to resolve type: dummy.Controllers.HomeController, service name:
here is my code
using System;
using System.Web.Mvc;
using System.Web.Routing;
using Umbraco.Core.Composing;
using Umbraco.Web;
namespace dummy.Components
{
public class RegisterCustomRouteComposer : ComponentComposer<RegisterCustomRouteComponent>
{
}
public class RegisterCustomRouteComponent : IComponent
{
public void Initialize()
{
RouteTable.Routes.MapRoute("Home", "{controller}/{action}/{id}", new
{
controller = "Home",
action = "Index",
id = UrlParameter.Optional
});
}
public void Terminate()
{
throw new NotImplementedException();
}
}
}
My controller class is
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace dummy.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
}
}
It depends a little on what you are trying to do as to what the best advice to offer is...
However the error you are seeing is because your HomeController only inherits from Controller, and therefore is not automatically registered with Umbraco's LightInject dependency injection container.
Therefore you can make the error go away, by registerring your HomeController explicitly via a UserComposer eg:
using Umbraco.Core;
using Umbraco.Core.Composing;
using Umbraco.Web.Routing;
using Umbraco8.Controllers;
using Umbraco8.Routing;
using Umbraco8.Services;
namespace Umbraco8.Composers
{
public class RegisterHomeControllerComposer : IUserComposer
{
public void Compose(Composition composition)
{
composition.Register<HomeController>(Lifetime.Request);
}
}
}
Then your boot error will go away.
If your aiming to use your custom controller with the Umbraco pipeline however - then no need to do this, as you should make your HomeController inherit from Umbraco.Web.Mvc.RenderMvcController then it will be automatically added to the LightInject container...
namespace Umbraco8.Controllers
{
public class HomeController : RenderMvcController
{
// GET: Home
public ActionResult Index()
{
return View();
}
}
}
If you are mapping an MVC route that you want to associate with Umbraco templates - eg have an underlying associated implementation of PublishedContent with your request then consider using MapUmbracoRoute instead eg
public class RegisterCustomRouteComposer : IUserComposer
{
public void Compose(Composition composition)
{
composition.Components().Append<RegisterCustomRouteComponent>();
}
}
public class RegisterCustomRouteComponent : IComponent
{
public void Initialize()
{
GlobalConfiguration.Configuration.MapHttpAttributeRoutes();
RouteTable.Routes.MapUmbracoRoute("HomeRoute", "home/{action}/{id}", new
{
controller = "Home",
id = UrlParameter.Optional
}, new UmbracoVirtualNodeByIdRouteHandler(1105));
}
public void Terminate()
{
throw new NotImplementedException();
}
}
}
(you can implement your own logic for UmbracoVirtualNodeHandler to construct the published content to associate to the request)
If you just want to 'hijack' requests to the home page of your site, then you could create a RenderMvcController with a name matching the alias of the document type of your homepage, and this would automagically be routed for the request:
public class HomePageController : Umbraco.Web.Mvc.RenderMvcController
public override ActionResult Index(ContentModel model)
{
return CurrentTemplate(model);
}
}
So knowing what you are trying to achieve would define what is the best approach - but at least the first bit of this reply explains the error you see!
Custom MVC Routes error
Dear Umbraco Team,
I have created a Custom MVC route, via this article. When i build and run application via Visual Studio i get the YSOD with the following error
here is my code
My controller class is
What have i done wrong ?
Thanks Dibs
Hi Dibs
It depends a little on what you are trying to do as to what the best advice to offer is...
However the error you are seeing is because your HomeController only inherits from Controller, and therefore is not automatically registered with Umbraco's LightInject dependency injection container.
Therefore you can make the error go away, by registerring your HomeController explicitly via a UserComposer eg:
Then your boot error will go away.
If your aiming to use your custom controller with the Umbraco pipeline however - then no need to do this, as you should make your HomeController inherit from Umbraco.Web.Mvc.RenderMvcController then it will be automatically added to the LightInject container...
If you are mapping an MVC route that you want to associate with Umbraco templates - eg have an underlying associated implementation of PublishedContent with your request then consider using MapUmbracoRoute instead eg
}
(you can implement your own logic for UmbracoVirtualNodeHandler to construct the published content to associate to the request)
If you just want to 'hijack' requests to the home page of your site, then you could create a RenderMvcController with a name matching the alias of the document type of your homepage, and this would automagically be routed for the request:
So knowing what you are trying to achieve would define what is the best approach - but at least the first bit of this reply explains the error you see!
regards
Marc
Hi Mark,
Could you please check the problem that we have? I tried everything but still having an error. The only way that I found was using Url Rewriting.
https://our.umbraco.com/forum/umbraco-8/99009-umbraco-v8-custom-routing-for-umbracoapicontroller
Hi Mark
Thanks for the reply : )
I was able to get rid of the error by my controller inheriting from RenderMvcController.
I was able to map MVC route with UmbracoVirtualNodeByRouterHandler(1111), how can i use this by using the template name instead of an ID ?
Thanks Dibs
is working on a reply...