Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

asp.net mvc2 - controller for master page and code organization

I've just finished my first ASP.NET MVC (2) CMS. Next step is to build website that will show data from CMS's database. This is website design:

http://img56.imageshack.us/img56/4676/portal.gif http://img56.imageshack.us/img56/4676/portal.gif


#1 (Red box) - displays article categories. ViewModel:

public class CategoriesDisplay
    {
        public CategoriesDisplay() { }

        public int CategoryID { set; get; }
        public string CategoryTitle { set; get; }
    }

#2 (Brown box) - displays last x articles; skips those from green box #3. Viewmodel:

public class ArticleDisplay
    {
        public ArticleDisplay() { }

        public int CategoryID { set; get; }
        public string CategoryTitle { set; get; }

        public int ArticleID { set; get; }

        public string ArticleTitle { set; get; }
        public string URLArticleTitle { set; get; }
        public DateTime ArticleDate;

        public string ArticleContent { set; get; }

    }

#3 (green box) - Displays last x articles. Uses the same ViewModel as brown box #2

#4 (blue box) - Displays list of upcoming events. Uses dataContext.Model.Event as ViewModel

Boxes #1, #2 and #4 will repeat all over the site and they are part of Master Page. So, my question is: what is the best way to transfer this data from Model to Controller and finally to View pages?

  1. Should I make a controller for master page and ViewModel class that will wrap all this classes together OR
  2. Should I create partial Views for every of these boxes and make each of them inherit appropriate class (if it is even possible that it works this way?) OR
  3. Should I put this repeated code in all controllers and all additional data transfer via ViewData, which would be probably the worse way :) OR
  4. There is maybe a better and more simple way but I don't know/see it?


Thanks in advance, Ile



EDIT:
If your answer is #1, then please explain how to make a controller for master page!

EDIT 2:
In this tutorial is described how to pass data to master page using abstract class: http://www.asp.net/LEARN/mvc/tutorial-13-cs.aspx
In "Listing 5 – Controllers\MoviesController.cs", data is retrieved directly from database using LINQ, not from repository. So, I wonder if this is just in this tutorial, or there is some trick here and repository can't/shouldn't be used?

like image 736
ilija veselica Avatar asked Apr 02 '10 18:04

ilija veselica


2 Answers

To get data to my Master Page:

  • I don't like using an abstract class to get data to the master page. I prefer composition over inheritance.
  • I don't like to use the ViewData dictionary because it's not strongly typed.

I would create Views, ViewModels and Actions for each section. Then call Html.RenderAction(...) For example:

I would create CategoriesDisplay.aspx with only the html for the redbox. I would pass that your CategoriesDisplay model. Then in my controller:

public class CategoryController : Controller
{
    public ActionResult DisplayCategories()
    {
      var model = new CategoriesDisplay();
      ...
      return View(model);
    }
}

Then in my Master Page:

<% Html.RenderAction<CategoryController>(c => c.DisplayCategoreis()); %>

This will render the CategoriesDisplay view inline within the Master Page. Which in turn allows you have SOC (Seperation of Concerns), clean and manageable code.

like image 166
mxmissile Avatar answered Oct 19 '22 15:10

mxmissile


I fought with this as well. Initially I did a lot of dumping of extra data into the ViewData, which ended up having to be casted back (made some extensions that eased this, but still not great).

I would go with your choice #1 and make a ViewModel that wraps all of the classes you would need.

like image 32
hunter Avatar answered Oct 19 '22 15:10

hunter