MyDaftQuestions
MyDaftQuestions

Reputation: 4691

MVC creating 'folders' and sub-folders

In ASP.NET WebForms (well, HTML to be honest) we could reference pages within folders. EG, my structure could be (in regards to folders only)

root -> MyProductsFolder -> Shoes -> Ladies

And my website would show

www.mysite.com/MyProducts/Shoes/Ladies/Page.aspx

In MVC, we use a controller and it would appear that we can only ever have 1 level (folder) deep. Is this right?

Without using URL rewriting, is it possible to have

www.mysite.com/MyProducts/Shoes/Ladies/Page

I assume the only way to do this is in the controller, but I can't create a controller named Shoes/Ladies

Upvotes: 0

Views: 137

Answers (2)

Carl
Carl

Reputation: 2295

You can use MVC routing to created this URL. Your routing table is usually found in your AppStart > RouteConfig.cs class. You can use the route table to create URL maps to your actions in your controllers.

Assuming that MyProducts is your controller, and Shoes, Ladies are variables you want to accept you can do something like:

routes.MapRoute("MyProducts", 
    "MyProducts/{category}/{subcategory}/Page", 
    new { controller = "MyProducts", action = "Index" });

Note that your routes should be in order of most to least specific, so add this route above the default route.

When you navigate to /MyProducts/Shoes/Ladies/Page, it will map to your index action result in your MyProducts controller, passing variables for category and subcategory, so your controller will look something like

public class MyProducts : Controller
{
    public ActionResult Index(string category, string subcategory)
    {
        //Do something with your variables here.
        return View();
    }
}

If my presumption is wrong, you want a view returned just for that URL, your route will look like:

routes.MapRoute("MyProducts", "MyProducts/Shoes/Ladies/Page", new { controller = "MyProducts", action = "LadiesShoes" });

And your Controller:

public class MyProducts : Controller
{
    public ActionResult LadiesShoes()
    {
        //Do something with your variables here.
        return View();
    }
}

You can safely omit the final "/page" on the URL if you want to.

If I haven't covered your exact scenario with the above examples, let me know and I will extend my answer.

UPDATE

You can still put your views in a folder structure under the views folder if you want - and then reference the view file location in the controller - in the following example, place your view file called Index.cshtml in Views/Shoes/Ladies/ folder:

public class MyProducts : Controller
{
    public ActionResult LadiesShoes()
    {
        //Do something with your variables here.
        return View("~/Views/Shoes/Ladies/Index.cshtml");
    }

    public ActionResult MensShoes()
    {
        //Do something with your variables here.
        return View("~/Views/Shoes/Mens/Index.cshtml");
    }
}

Upvotes: 2

Ekk
Ekk

Reputation: 5715

You can use Attribute Routing to define the url of each action like below.

public class ShoeController : Controller
{
    // eg: /nike/shoes/lady
    [Route("{productName}/shoes/{xxx}")]
    public ActionResult View(string productName, string xxx)
    {
    }
}

Routing Attribute offers flexibility and better code organization. You can check the route definition in the same spot.

Upvotes: 0

Related Questions