I’ve updated the sample MVC project I wrote for using ASP.NET MVC 3 and the Razor view engine.
A minor change is that I no longer use the FluentValidationModelValidatorProvider but the standard one. So I decorate the view model with the necessary data annotations :
[Validator(typeof(UserViewModelValidator))] public class UserViewModel { public int Id { get; set; } [DisplayName("First name *")] public string FirstName { get; set; } [DisplayName("Last name *")] public string LastName { get; set; } public int? Age { get; set; } }
And the validator becomes :
public class UserViewModelValidator : AbstractValidator<UserViewModel> { public UserViewModelValidator() { RuleFor(x => x.FirstName) .NotEmpty() .WithMessage("First name is required"); RuleFor(x => x.LastName) .NotEmpty() .WithMessage("Last name is required"); } }
And here are the corresponding views using Razor :
Index.cshtml
@model IEnumerable<SampleMvc.Web.Models.UserViewModel> @{ ViewBag.Title = "Index"; } <h2>Index</h2> @(Html .Grid<UserViewModel>(Model) .Columns(column => { column.Custom(model => Html.Partial("_TableLinks", model)); column.For(model => model.FirstName); column.For(model => model.LastName); column.For(model => model.Age); }) ) <p> @(Html.ActionLink<UsersController>(c => c.New(), "Create New")) </p>
_TableLinks.cshtml
@model SampleMvc.Web.Models.UserViewModel @(Html.ActionLink<UsersController>(c => c.Edit(Model.Id), "Edit")) | @(Html.ActionLink<UsersController>(c => c.Show(Model.Id), "Details")) | @using (Html.BeginForm<UsersController>(c => c.Destroy(Model.Id))) { @Html.HttpMethodOverride(HttpVerbs.Delete) <input type="submit" value="Delete" /> }
Edit.cshtml
@model SampleMvc.Web.Models.UserViewModel @{ ViewBag.Title = "Edit"; } <h2>Edit</h2> @using (Html.BeginForm<UsersController>(c => c.Update(null))) { @Html.ValidationSummary(true) @Html.HttpMethodOverride(HttpVerbs.Put) @Html.HiddenFor(model => model.Id) @Html.EditorForModel() <p> <input type="submit" value="Save" /> </p> } <div> @(Html.ActionLink<UsersController>(c => c.Index(), "Back to List")) </div>
New.cshtml
@model SampleMvc.Web.Models.UserViewModel @{ ViewBag.Title = "New"; } <h2>New</h2> @using (Html.BeginForm<UsersController>(c => c.Create(null))) { @Html.ValidationSummary(true) @Html.EditorForModel() <p> <input type="submit" value="Create" /> </p> } <div> @(Html.ActionLink<UsersController>(c => c.Index(), "Back to List")) </div>
Show.cshtml
@model SampleMvc.Web.Models.UserViewModel @{ ViewBag.Title = "Show"; } <h2>Show</h2> @Html.DisplayForModel() <p> @(Html.ActionLink<UsersController>(c => c.Edit(Model.Id), "Edit")) | @(Html.ActionLink<UsersController>(c => c.Index(), "Back to List")) </p>
UserViewModel.cshtml editor template
@model SampleMvc.Web.Models.UserViewModel <fieldset> <legend>Fields</legend> <div class="editor-label"> @Html.LabelFor(model => model.FirstName) </div> <div class="editor-field"> @Html.EditorFor(model => model.FirstName) @Html.ValidationMessageFor(model => model.FirstName) </div> <div class="editor-label"> @Html.LabelFor(model => model.LastName) </div> <div class="editor-field"> @Html.EditorFor(model => model.LastName) @Html.ValidationMessageFor(model => model.LastName) </div> <div class="editor-label"> @Html.LabelFor(model => model.Age) </div> <div class="editor-field"> @Html.EditorFor(model => model.Age) @Html.ValidationMessageFor(model => model.Age) </div> </fieldset>
UserViewModel.cshtml display template
@model SampleMvc.Web.Models.UserViewModel <fieldset> <legend>Fields</legend> <div class="display-label">Id</div> <div class="display-field">@Html.DisplayFor(x => x.Id)</div> <div class="display-label">FirstName</div> <div class="display-field">@Html.DisplayFor(x => x.FirstName)</div> <div class="display-label">LastName</div> <div class="display-field">@Html.DisplayFor(x => x.LastName)</div> <div class="display-label">Age</div> <div class="display-field">@Html.DisplayFor(x => x.Age)</div> </fieldset>