KoffeeKoder


  • Getting Started with the ASP.NET MVC Framework
    published on 5/27/2008 2:58:16 PM
  • Today, I played around with the new ASP.NET MVC Framework. I have to admit it is quite intriguing. I created a small application in which the user can select a particular category and view all the articles related to that category. When the user clicks on a particular article the application redirect the user to the appropriate article. The first thing is to create a CategoriesController which managers the categories. Here is the implementation.

    public class CategoriesController : Controller
        {

            [ControllerAction]
            public void Index()
            {
              
            }

            [ControllerAction]
            public void List()

            {
                var categories = CategoryRepository.GetAll<Category>();
                ViewData.Add("Categories", categories);
                RenderView("Categories", categories);
            }

          
        }

    The List action gets the categories list from the database and renders the "Categories" view display the categories. The Categories view looks something like the following:

     public partial class Categories : ViewPage<IEnumerable<GridViewGuyWebApps.Models.Category>>
        {

        }

    The ViewPage accepts an IEnumerable<Category> which means we will be able to access the ViewData bag in the form of the IEnumerable<Category>. Now, let's take a look at the HTML part of the view:

    <% foreach (var category in ViewData)
           {
              
          %>
         
          <li>
          <%=  Html.ActionLink(category.Title, new { controller = "Articles", action = "List", category = (category.Title.Replace(".","_")) }) %>
          </li>
          
           <% } %>

    The foreach loop simply iterated over the ViewData which in this case is IEnumerable<Category> and created links to navigate to the articles contained in that category. Some of the category titles contained "." so I just replaced them with the "_" no biggy deal there!

    The second argument to the Html.ActionLink method is pretty cool! It allows you to write your own URL. The URL that I am interested is the following:

    http://YourWebApplication/Articles/List/[Category]

    This means if I have some articles which belong to the "Security" category then my URL will be something like:

    http://YourWebApplication/Articles/List/Security

    For this to work correctly you will need to modify the Global.asax file and add a route.

     protected void Application_Start(object sender, EventArgs e)
            {
                // Note: Change Url= to Url="[controller].mvc/[action]/[id]" to enable
                //       automatic support on IIS6

                RouteTable.Routes.Add(new Route
                {
                    Url = "Articles/List/[category]",
                    Defaults = new { controller = "Articles", action = "List", category = (string)null },
                    RouteHandler = typeof(MvcRouteHandler)
                });

                RouteTable.Routes.Add(new Route
                {
                    Url = "[controller]/[action]/[id]",
                    Defaults = new { action = "Index", id = (string)null },
                    RouteHandler = typeof(MvcRouteHandler)
                });

                RouteTable.Routes.Add(new Route
                {
                    Url = "Default.aspx",
                    Defaults = new { controller = "Home", action = "Index", id = (string)null },
                    RouteHandler = typeof(MvcRouteHandler)
                });


            }

    Url = "Articles/List/[category]" means that the List action of the Articles controller will take the "category" as the parameter. Now, let's take a look at the List action of the ArticlesController.

    public class ArticlesController : Controller
        {

            [ControllerAction]
            public void Index()
            {
                //Add action logic here
            }

            [ControllerAction]
            public void List(string category)
            {
                var articles = ArticleRepository.GetByCategoryName(category.Replace("_","."));
                ViewData.Add("Articles", articles);
                RenderView("Articles",articles);
            }

            [ControllerAction]
            public void Details(int id)
            {
                var article = ArticleRepository.GetById(id);
                ViewData.Add("Article", article);
                RenderView("Details", article);
            }
        }

    That is pretty much it. I am in the process of writing a new article on ASP.NET MVC Framework in which I will cover the complete details.