Here are 2 minor nice enhancements for MVC 4.
Conditional Attribute Enhancements
This enhancement is something I really like. If you are accustomed to write server-side code embedded with HTML, you probably ran into ugly spaghetti code like this:
<!DOCTYPE html> <html> <head> </head> <body> @{ string css = "myDiv"; } <div class='@{ if (css != null) {<text>@css</text>} }'></div> </body> </html>
In MVC 4, one enhancement allows you to save quite a lot of spaghetti confusing code, by interpreting the Code Nugget for you, like so:
<!DOCTYPE html> <html> <head> </head> <body> @{ string css = "myDiv"; } <div class='@css'></div> </body> </html>
Even more, you can really shorten things by inserting lengthy strings and render less HTML:
<!DOCTYPE html> <html> <head> </head> <body> @{ string css = "class=myDiv"; } <div @css></div> </body> </html>
Note that if you would have used apostrophes, they would have been HTML encoded. So this:
<!DOCTYPE html> <html> <head> </head> <body> @{ string css = "class='myDiv'"; } <div @css></div> </body> </html>
is rendered like this:
<!DOCTYPE html> <html> <head> </head> <body> <div class='myDiv'></div> </body> </html>
If you would like to avoid encoding, just use Html.Raw( ) as usual:
<!DOCTYPE html> <html> <head> </head> <body> @{ var css = @Html.Raw("class='myDiv'"); } <div @css></div> </body> </html>
Note that Html.Raw returns an IHtmlString, and this works just as well. It seems like the Code Nugget simply performs a ToString( ) with HTML encoding on the given variable. This can be tested easily. Consider this code:
using System.Web.Mvc; namespace MVCEnhancements.Controllers { public class MyModel { public override string ToString() { return "t'is my code"; } } public class HomeController : Controller { public ActionResult Index() { return View(new MyModel()); } } }
and the corresponding cshtml (note the @Model in line 9):
<!DOCTYPE html> <html> <head> </head> <body> @{ var css = @Html.Raw("class='myDiv'"); } <div @css>@Model</div> </body> </html>
This renders the following:
<!DOCTYPE html> <html> <head> </head> <body> <div class='myDiv'>t'is my code</div> </body> </html>
As you can well see, ToString( ) was called and it was also Html Encoded.
URL Resolution Enhancements
Instead of using Url.Content with a tilde,
<!DOCTYPE html> <html> <head> <script src='@Url.Content("~/Scripts/jquery-1.6.2.js")'></script> </head> <body> <div> </div> </body> </html>
You can just use the tilde like so:
<!DOCTYPE html> <html> <head> <script src='~/Scripts/jquery-1.6.2.js'></script> </head> <body> <div> </div> </body> </html>