See also the ASP.NET Core-implementation of this project.
For any serious web-application you should always implement a solid Search engine optimization-strategy, but there is no standardized way to handle this in ASP.NET MVC, out of the box.
You could easily use the ViewBag
-object to send dynamic
values from Controller
-Actions
into Views
, like this, for example:
public ActionResult Index()
{
this.ViewBag.PageTitle = "This is the page title";
return this.View();
}
Then you'd have to make sure you correctly spell or copy-paste ViewBag.PageTitle
correctly into your View
:
<head>
<title>@ViewBag.PageTitle</title>
<!-- More head-values -->
</head>
One problem is that if you refactor the naming for ViewBag.PageTitle
into, for example ViewBag.Title
, this will break the functionality, potentially website-wide, because you won't get any tooling-help from Visual Studio for that rename.
This is why I created a framework for ASP.NET MVC SEO, to get structured and reusable functionality around the SEO-data for a web-application. The framework is available on Nuget, with the source-code on GitHub.
Setting SEO-values
You can set SEO-values using the properties on a SeoHelper
-object in Controller
-Actions
and Views
, or you can use ActionFilter
-attributes
in Controllers
, to set SEO-related data like:
- Meta-Description
- Meta-Keywords
- Title, split on page-title and base-title (website-title)
- Canonical Link
- Meta No-index for robots
This can be done inside Controllers
and Controller
-Actions
:
[SeoBaseTitle("Website name")]
public class InfoController : SeoController
{
[SeoTitle("Listing items")]
[SeoMetaDescription("List of the company's product-items")]
public ActionResult List()
{
var list = this.GetList();
if (list.Any())
{
this.Seo.Title += $" (Total: {list.Count})";
this.Seo.LinkCanonical = "~/pages/list.html";
}
else
{
this.Seo.MetaRobotsNoIndex = true;
}
return this.View(model);
}
}
If you don't want to inherit from SeoController
to get access to the this.Seo
-property, you can use the extension-method GetSeoHelper
:
public class InfoController : Controller
{
public ActionResult List()
{
var seo = this.GetSeoHelper();
seo.Title = "Page title";
return this.View(model);
}
}
You can even set SEO-values inside Views
:
@{
this.Layout = null;
this.Seo.MetaRobotsNoIndex = true; // Always block Robots from indexing this View
}
Rendering SEO-values
These SEO-values can easily be accessed and rendered as HTML-tags inside Views through provided HtmlHelper
-extensions:
<head>
@Html.SeoTitle()
@Html.SeoLinkCanonical()
@Html.SeoMetaDescription()
@Html.SeoMetaKeywords()
@Html.SeoMetaRobotsIndex()
</head>
See the README
-file on GitHub for the latest detailed information about this ASP.NET MVC SEO-framework. Or try it out through Nuget by running Install-Package AspNetSeo.Mvc
in your project. You can even follow the absolutely latest build on MyGet.