0% found this document useful (0 votes)
248 views

MVC Cheat Sheet PDF

The document describes an Entity Framework model class for an Employee entity with various data validation attributes. Key properties like FirstName and FamilyName are marked as required. Email is validated as an email address. IpAddress uses a regular expression for validation. BirthMonth is range validated between 1-12. Messages and Department are navigation properties. The model is used in a Razor view to display and edit employee details. The controller actions like Index, Edit, and Delete interact with the Entity Framework context and model to perform CRUD operations.
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
248 views

MVC Cheat Sheet PDF

The document describes an Entity Framework model class for an Employee entity with various data validation attributes. Key properties like FirstName and FamilyName are marked as required. Email is validated as an email address. IpAddress uses a regular expression for validation. BirthMonth is range validated between 1-12. Messages and Department are navigation properties. The model is used in a Razor view to display and edit employee details. The controller actions like Index, Edit, and Delete interact with the Entity Framework context and model to perform CRUD operations.
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 5

Entity Framework / Validation Model

namespace MyApp.Model {
public class Employee
{
[Key]
[DatabaseGeneratedAttribute(
DatabaseGeneratedOption.Identity)]
public int EmployeeId { get; set; }
[Required]
public string FirstName { get; set; }
[Required]
public string FamilyName { get; set; }
[EmailAddress]
public string Email { get; set; }

Database primary key


Key is automatically generated by
incrementing a counter
Property value cannot be null / empty

Property value must be formatted as


an email address
Property value must match the
supplied regular expression

[RegularExpression("\\d+\\.\\d+\\.\\d+\\.\\d+",
ErrorMessage = "Invalid IP address format")]
public string IpAddress { get; set; }
Declare navigation properties to be

virtual if you want lazy loading


public virtual Department Department { get; set; }

This list contains all Messages with an


Author property that is this Employee
[InverseProperty("Author")]
public virtual ICollection<Message> Messages { get; set; }
public bool IsFullTime { get; set; }
[Range(1, 12)]
public int BirthMonth { get; set; }
[Timestamp]
public byte[] RowVersion { get; set; }

Property value must be between 1


and 12 (inclusive)
This property is a timestamp used for
optimistic concurrency control

[NotMapped]
public string FullName
{
get { return FirstName + " " + FamilyName; }
}
}
}

This property is to be ignored by


Entity Framework

Import namespace into Razor view

Razor View
@using MyApp.Models
@model Employee
@{
Layout = "~/Views/_Base.cshtml";
ViewBag.Title = "Employee Information";
}

Declare a typed View

Use a master layout / template


Set a property of the ViewBag
dynamic object

<h2>Employee Information</h2>
<p>These are the details of @Model.FullName:</p>
Write out a value
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
Create a HTML <form> tag
@Html.ValidationSummary()
<div>
First Name: @Html.TextBoxFor(x => x.FirstName) Generate a token to prevent Cross</div>
Site-Forgery-Requests (CSFRs)
<div>
Family Name: @Html.TextBoxFor(x => x.FamilyName)
Show any validation errors
</div>
<div>
Birth Month: @Html.TextBoxFor(x => x.BirthMonth)
Create Text-boxes for Properties of
</div>
the Model
<div>
IP Address: @Html.TextBoxFor(x => x.IpAddress)
</div>
<div>
Full Time:
@Html.DropDownListFor(
Create a Drop-down list for IsFullTime
x => x.IsFullTime,
property of the model
new [] {
new SelectListItem {
Text = "Full Time",
Value = "true",
Selected = Model.IsFullTime
},
new SelectListItem {
Text = "Part Time",
Value = "false",
Selected = !Model.IsFullTime
}
})
</div>
<input type="submit" value="Save Changes" />

Razor comments

@* Dont show the messages section if there are no messages *@


@if (Model.Messages != null && Model.Messages.Count() > 0)
{
<p>Messages for @Model.FullName:</p>
If Statement
<ul>
@foreach (var message in Model.Messages)
Loop
{
<li>@message.MessageId</li>
}
</ul>
Manually create a URL to use in a link
}
<a href="@Url.Action("Index")">List All Employees</a> Create a link referring to the Index
@Html.ActionLink("List All Employees", "Index")
action of the same controller
@Html.ActionLink("Go to Home", "Index", "Home")
@Html.ActionLink("View Employee 1", "Details", new { id = 1 }, null)
@Html.Raw("&nbsp;")
@section Author {
This page created by Ben.
}

Create a link referring to the Index


action of the HomeController

Create a link referring to the Details


action with route/model parameters
Output a string directly as raw HTML,
without any escaping

Template
<html>
<title>@ViewBag.Title</title>
<body>
<h1>My App</h1>
<div>
@RenderBody()
</div>
<div>
@if (IsSectionDefined("Author"))
{
@: Author Information:
@RenderSection("Author")
}
</div>
</body>
</html>

Define a section (to use in a template)

Render the main content of the file


that is using this template
Switch back to plain HTML text when
in a section of C# code
Render a section that was defined
using @section

Controller
...
using System.Data.Entity;
namespace MyApp.Controllers
{
[Authorize]
public class EmployeeController : Controller
{

Contains the .Includes() extension


method used for Eager loading

A user must be logged in to use the


Actions on this controller

An exception to the need for

[AllowAnonymous]
authorization (no need to login)
public ActionResult Index()
{
using (var context = new MyAppContext())
{
var emps = context.Employees
.Include(x => x.Messages).Include(x => x.Department)
.ToList();
Eager loading for view rendering
return View(emps);
(when there is no DbContext)
}
}

Show the strongly typed View


[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)] matching this Action (Index.cshtml)
[Authorize(Roles = "Administrator")]
public ActionResult Delete(int id)
Accept HTTP verbs GET and POST
{
using (var context = new MyAppContext())
{
var employee = new Employee { EmployeeId = id };
context.Employees.Attach(employee);
Require the user to belong to the
context.Employees.Remove(employee);
Administrator Role
context.SaveChanges();
return RedirectToAction("Index");
Redirect the user to the Index action
}
}

Use this action for GET requests (i.e.,

[HttpGet]
to retrieve an empty/current form)
public ActionResult Edit(int id)
{
using (var context = new MyAppContext())
{
var emp = context.Employees
.Include(x => x.Messages).Include(x => x.Department)
.Where(x => x.EmployeeId == id).Single();
return View(emp);
}
Use this action when the user POSTs
}

back a form (i.e., saves changes)


Check for the token created by
@Html. AntiForgeryToken()

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(int id, Employee employee)
{
Use HTML Get/Post parameters to
if (ModelState.IsValid)
construct an Employee object
{
if (employee.IpAddress == "127.0.0.1")
{
ModelState.AddModelError("", "Do not use 127.0.0.1");
return View(employee);
Were there any validation errors
}
when creating the Employee object?
else
{
using (var context = new MyAppContext())
{
var oldEmployee = Context.Employees.Find(id);
UpdateModel(oldEmployee);
Add a custom validation error for
@Html.ValidationSummary()
context.SaveChanges();
return View("Details", employee);
}
}
Use HTML Get/Post parameters to
}
update the Employee object
else
{
Return the Details strongly typed
return View(employee);
view (Details.cshtml)
}
}
}
}

You might also like