MVC route attribute no controller

964 views Asked by At

I'm building an intranet where I have the following home controller:

[Route("{action=index}")]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(HomeModelBuilder.BuildHomeModel());
    }

    public ActionResult FormsHome()
    {
        return View(HomeModelBuilder.BuildFormsHomeModel());
    }
}

I'm trying to get my forms homepage to have a url of http://intranet/forms so I thought I could do this using the following routing attribute:

    [Route("~/forms")] // have also tried 'forms' and '/forms'
    public ActionResult FormsHome()

but when I go to the url, it complains that multiple controllers have that route:

The request has found the following matching controller types: HRWebForms.Website.Controllers.ChangeDetailsController HRWebForms.Website.Controllers.InternalTransferController HRWebForms.Website.Controllers.LeaverController ...

I have also tried adding [RoutePrefix("")] to the controller but this didn't work either

Is there a way to give that action a url of "forms" (without any controller or without adding a separate forms controller with an index) by just using routing attributes?

2

There are 2 answers

0
Pete On BEST ANSWER

Ok so ranquild's comment pushed me in the right direction. In my route config, I had the default route of

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

So that my homepage would still work on the url with nothing in. If I changed this to

// Needed for homepage
routes.MapRoute(
    name: "Home",
    url: "",
    defaults: new { controller = "Home", action = "Index" }
);

// Needed for Html.ActionLink to work
routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}",
    defaults: new { controller = UrlParameter.Optional, action = UrlParameter.Optional }
);

It seemed to solve the problem

0
Mateusz Marczukiewicz On

You could try adding [RoutePrefix("forms")] to your controller, but this will result in all your actions expecting the same prefix.

There is a walkaround for this too (by using [Route("~/RouteParam/AnotherRouteParam")] to have Route "RouteParam/AnotherRouteParam") but it seems to me that FormsController would cost less work.