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 bo开发者_Go百科x) - 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?
- Should I make a controller for master page and ViewModel class that will wrap all this classes together OR
- 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
- Should I put this repeated code in all controllers and all additional data transfer via ViewData, which would be probably the worse way :) OR
- There is maybe a better and more simple way but I don't know/see it?
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.
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.
精彩评论