Olivier Sin Fai Lam
Olivier Sin Fai Lam

Reputation: 85

Routing Issues MVC4

I want to have my URL to be /{page number} for my home page for example localhost:50915/1 for page 1 for a list of records, my URL routing is as follows:

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "EditForm",
            url: "{controller}/{formid}",
            defaults: new { controller = "ManageForm", action = "Update", id = UrlParameter.Optional }
        );

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

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

The second MapRoute method is the one which I added to perform the desirable action. It works perfectly fine, but whenever I try to access another Controller "ManageController" for e.g localhost:50915/ManageForm it returns me the home page (same page showing the list of records).

Here is a snapshot of my solution:

Solution Snapshot

Whenever I tried to remove the lines of codes which perform this URL rerouting for the Home Page pagination, everything works fine, but of course the URL will be as localhost:50915?page=1

My HomeController is as follows:

public class HomeController : Controller
{
    //
    // GET: /Home/
    [HttpGet]
    public ViewResult Index(int page = 1)
    {
        const int pageSize = 4;
        FormCollection forms = FormService.GetAllActiveForms(page, pageSize);

        var formModel = new FormListViewModel
        {
            Forms = forms,
            PagingInfo = new PageInfo
            {
                PageNumber = page,
                PageSize = pageSize,
                TotalItems = forms.Count > 0 ? forms[0].TotalRecord : 0
            }
        };

        return View(formModel);
    }
}

Help much appreciated thanks.

Upvotes: 2

Views: 73

Answers (2)

Olivier Sin Fai Lam
Olivier Sin Fai Lam

Reputation: 85

Solution would be to map a new routing for the manage form to result in the url /ManageForm/Create

I have changed the RouteConfig.cs as follows:

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

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

        //ManageForm/{formid}
        routes.MapRoute(
            name: "EditForm",
            url: "{controller}/{formid}",
            defaults: new { controller = "ManageForm", action = "Update", id = UrlParameter.Optional }
        );

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

Upvotes: 0

kamil-mrzyglod
kamil-mrzyglod

Reputation: 4998

You cannot use localhost:50915/ManageForm cause it conflicts with another route definition. MVC does not see the difference between "{controller}/{formid}" and "{page}" when your route parameter is optional.

You have to use your first route as localhost:50915/ManageForm/{formId} to get it working.

Upvotes: 1

Related Questions