views:

213

answers:

2

Hi,

I'm wondering what is the best way to handle URL in MVC. For ecemple, in my application I have a PageControlle so when I view any page of my website it goes to /website/Page/Index/3 or if it's home page it goes to /website/Page/home and all my link in my menu are build dynamicly with Html.ActionLink() and T4MVC so I don't get anything hardcoded.

Now what I want to do is to point my url and links to something more SEO friendly like, for exemple, /website/our-company/ and it can also have children like /website/our-company/location/ or /website/our-company/employes/. You get the idea.

All my Pages are save to the BD ans I got a FriendlyUrl property and a parentId in my object.

How can I do this? What's is the best way of doing it?

A: 

Better have a look at :

Asad Butt
I now this stuff but I'm not quite sure how I can do what I'm trying to do up here, Is it possible that my Html.ActionLink() will redirect to /website/our-company/location/ when I point to MVC.Page.Index(12)? And what does my route should look like since I don't want the "Page", witch is the controller, part in my url?
VinnyG
+1  A: 

Ok I took a look at http://www.asp.net/learn/mvc/tutorial-23-cs.aspx and I got it working. More simple than I tought...

My routes :

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

        routes.MapRoute("Pages3", "{url1}/{url2}/{url3}", MVC.Page.RedirectTo(), new { url1 = "", url2 = "", url3 = "" });
        routes.MapRoute("Pages2", "{url1}/{url2}", MVC.Page.RedirectTo(), new { url1 = "", url2 = "", url3 = "" });
        routes.MapRoute("Pages1", "{url1}", MVC.Page.RedirectTo(), new { url1 = "", url2 = "", url3 = "" });

    }

And now my controller :

public virtual ActionResult RedirectTo(string url1, string url2, string url3)
    {
        if (string.IsNullOrEmpty(url1)) return Home();

        var pageModel = new PageModel();
        pageModel.CurrentPage = _pageRepo.GetByUrl(url1, url2, url3);
        BuildMenusAndBreadCrumb(pageModel);
        ViewData.Model = pageModel;

        return View(Views.Index);
    }

And here's how I render a link (my menu exemple) :

<div class="header_menu_content">
<ul id="main_menu_header">
    <% foreach(var item in Model) {%>
        <% if(item.Children != null){ %>
            <li><%= Html.ActionLink(item.Title, MVC.Page.RedirectTo(item.Url, "", ""))%>
            <ul>
            <% foreach (var child in item.Children){ %>
                <li><%= Html.ActionLink(child.Title, MVC.Page.RedirectTo(item.Url, child.Url, "")) %></li>
            <% }%>
            </ul>
            </li>
        <% } else { %>
            <li class="nochild"><%= Html.ActionLink(item.Title, MVC.Page.RedirectTo(item.Url, "", "")) %></li>
        <% } %>
    <%} %>
</ul>

Works perfectly for my needs! If you have any question or comments don't be shy! I'm not sure it's the best way to do it but I'm happy with it!

Note that the route order is important and also, if you dont put the default value and are in a page where url2 = something (site/section/page) then all youre link will point to site/newsection?url2=page took me a while to figure out why that url2 param was there but now it's all right!

VinnyG