T4MVC 2.6: MVC 2 Areas support
To get the latest build of T4MVC:
Go to T4MVC page on CodePlex
One of MVC 2's major new features is the support for breaking up a large application into "Areas". This works by following a structure that looks like:
- Root folder
- Models
- Views
- Controllers
- Areas
- NerdDinner
- Models
- Views
- Controllers
- Blog
- Models
- Views
- Controllers
- NerdDinner
So basically you still have your top level Models/Views/Controllers folders, and in addition to that you can have an arbitrary number of “Areas”, each having their own set of Models/Views/Controllers folders.
Starting with MVC 2.6, T4MVC lets you use areas in much the same way it lets you access top level items. e.g. you can now write:
<%= Html.ActionLink("Delete Dinner", MVC.NerdDinner.Dinners.Delete(Model.DinnerID))%>
Note how we referred to the controller as MVC.NerdDinner.Dinners.
Optionally, if you set IncludeAreasToken to true in the settings file, this becomes:
<%= Html.ActionLink("Delete Dinner", MVC.Areas.NerdDinner.Dinners.Delete(Model.DinnerID))%>
Lots of headaches to find a good naming pattern for Areas in T4MVC
Surprisingly, one of the things that caused the most headaches in getting this working was finding a well working naming pattern.
Here are the patterns that were on the table:
- MVC.NerdDinner.Dinners
- MVC.NerdDinnerArea.Dinners
- MVC.Areas.NerdDinner.Dinners
#1 is the simplest and most concise, but breaks if you have a top level controller that has the same name as the area.
#2 appends ‘Area’ to the area name to solve the conflict we caused by #1. But while it solves the conflict, you end up with a slightly quirky naming scheme.
#3 uses an extra Areas token before the area name to avoid the conflict. The drawback here is that you end up with one more token, meaning one more thing to type through in intellisense.
I then polled twitter to see whether people preferred #2 or #3, and most went with the cleaner and more wordy #3.
Then Nikhil suggested using a hybrid of #1 and #2, where we only append ‘Area’ to the area name if we detect a conflict with a top level controller name. Let’s call this #4!
So I ended up supporting both #3 and #4, based on the IncludeAreasToken switch in the settings file.
But frankly, I’m considering getting rid of #3. In the twitter poll, people didn’t like #2 mostly because it’s weird to have that extra ‘Area’ suffix. But with the hybrid #4 solution, this funky name only occurs exceptionally, making it much less of an issue.
To end this post, I’d like to thank Nathan Roe for helping out putting together this change!
Comments
Anonymous
November 29, 2009
In my opinion,the #3 is the best solution.Anonymous
November 29, 2009
Why not MVC.NerdDinner.Areas.Dinners?Anonymous
November 30, 2009
@Tom: can you explain why you like #3 more than #4? Is it because it matches the physical folder structure? @Jim: I don't understand this suggestion, as it doesn't avoid the conflict, and is as long as #3. To be clear, in this example NerdDinners is the area name and Dinners is the controller name.Anonymous
November 30, 2009
Hi, Why don't have each one as a separate project ? Thanks, ThaniAnonymous
November 30, 2009
@Thanigainathan: the MVC 2 Areas feature works in a single project, and our goal here is to make T4MVC work with that feature rather than create a different model.Anonymous
December 01, 2009
Hello, I tried this before with ASP.net MVC beta but i get error when i have two controller with same name present. For Example : if top level controller contain HomeController and in areas also i have homecontroller then it create problem. Do you know how can i overcome this issue ?Anonymous
December 01, 2009
@Jinal: could you include the full error that you are getting? Thanks!Anonymous
December 01, 2009
I like number 2. Seems to stick with naming convention of Controllers. Maybe also something like MVC.ANerdDinner.DinnersAnonymous
December 01, 2009
I like #3 for best recognition.Anonymous
December 02, 2009
hello, i get this type of error. The controller name 'Home' is ambiguous between the following types: MvcApplication12.Controllers.HomeController MvcApplication12.Areas.Blog.Controllers.HomeController I created homecontroller in areas of blog too but it is for blog home.Anonymous
December 02, 2009
@Jinal: what you're seeing is unrelated to T4MVC, and you should get the same error without it. It has to do with the way MVC looks for controller classes by default. This is not the best place to discuss general MVC issue, but if you start a thread on the MVC forum (http://forums.asp.net/1146.aspx), I'm sure the experts will jump in with a lot of info about how this works and what you can do about it.Anonymous
December 24, 2009
Can you add support for nested folders in StaticFilesFolders array (i. e. "Assets/Javascripts")?Anonymous
December 24, 2009
@nick4eva: I thought nested folders were already supported. Let's follow up on the forum (http://forums.asp.net/1215.aspx) to discuss further. Thanks!Anonymous
January 07, 2010
I took a different approach to Areas which works in MVC v1... http://goodcoffeegoodcode.blogspot.com/2010/01/aspnet-mvc-groups.html