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>