Aplikacje sieciowe
MVC
Literatura
• msdn.microsoft.com
• www.asp.net/mvc
– Screencast Pluralsight
Model Viewer Controler
Controler
Viewer Model
Struktura Projektu MVC
Model
public class Osoba { [Key]
public virtual int Id { get; set; }
[Required]
[Display(Name = "Imię")]
public virtual string Imie { get; set; }
[Required]
public virtual string Nazwisko { get; set; }
[Display(Name = "Numer telefonu")]
public virtual string NrTelefonu { get; set; }
[Display(Name = "Adres e-mail")]
public virtual string Email { get; set; }
[Display(Name = "Numer dowodu")]
public virtual string NrDowodu { get; set; } ...}
//
public class Student: Osoba {
[Required]
[Display(Name="Numer Indeksu")]
public virtual string NrIndeksu { get; set; } public virtual bool MaPraktyke { get; set; } public virtual DateTime Rocznik { get; set; }
public Student() {
Rocznik = DateTime.Now;
}
}
Kontroler (Controler)
public class StudentController : Controller {
//
// GET: /Student/
PraktykiDB baza = new PraktykiDB();
public ActionResult Index() {
// BazaDanychPraktyk baza = new BazaDanychPraktyk();
var model = baza.Studenci;
return View(model );
}
….
Controler - Tworzenie
public ActionResult NowyStudent() {
var model = new Student();
return View(model);
}
public ActionResult Create() {
return NowyStudent();
}
[HttpPost]
public ActionResult Create(Student newStudent) {
baza.Studenci.Add(newStudent);
baza.SaveChanges();
return RedirectToAction("Index");
}
Controler Edycja
public ActionResult Edit(int id) {
Student student = baza.Studenci.Single(s => s.Id == id);
return View(student);
}
[HttpPost]
public ActionResult Edit(int id, FormCollection collection) {
Student student = baza.Studenci.Single(s => s.Id == id);
if(TryUpdateModel(student)) {
baza.SaveChanges();
return RedirectToAction("Index");
}
return View(student);
}
Controler - Kasowanie
Widok (View)
• Index.cshml
• Create.cshtml
• Details.cshtml
• Edit.cshtml
• …
Index.cshtml
@model IEnumerable<PraktykiStudenckie.Models.Student>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<p> @Html.ActionLink("Create New", "Create") </p>
<table>
<tr> <th> NrIndeksu </th> <th> Imie </th> <th> Nazwisko </th>
… </tr>
@foreach (var item in Model) { <tr>
<td> @Html.DisplayFor(modelItem => item.NrIndeksu) </td>
<td> @Html.DisplayFor(modelItem => item.Imie) </td>
<td> @Html.DisplayFor(modelItem => item.Nazwisko) </td> ….
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.Id }) | @Html.ActionLink("Details", "Details", new { id=item.Id }) |
@Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ }) </td>
</tr>
}
</table>
Create.cshtml
@model PraktykiStudenckie.Models.Student
@{
ViewBag.Title = "Create";
}
<h2>Create</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm()) { @Html.ValidationSummary(true) <fieldset>
<legend>Student</legend>
<div class="editor-label"> @Html.LabelFor(model => model.NrIndeksu) </div>
<div class="editor-field"> @Html.EditorFor(model => model.NrIndeksu) @Html.ValidationMessageFor(model => model.NrIndeksu) </div>
<div class="editor-label"> @Html.LabelFor(model => model.Imie) </div>
<div class="editor-field"> @Html.EditorFor(model => model.Imie) @Html.ValidationMessageFor(model => model.Imie) </div>
<div class="editor-label"> @Html.LabelFor(model => model.Nazwisko) </div>
<div class="editor-field"> @Html.EditorFor(model => model.Nazwisko) @Html.ValidationMessageFor(model => model.Nazwisko) </div>
<p> <input type="submit" value="Create" /> </p>
</fieldset>
}
<div> @Html.ActionLink("Back to List", "Index") </div>
Html helpers
• @Html.ActionLink
• @Html.DisplayFor
• @Html.LabelFor(model => model.NrIndeksu)
• @Html.EditorFor(model => model.NrIndeksu)
• @Html.ValidationMessageFor(model => model.NrIndeksu)
• @Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")
• @Html.ActionLink
• @Html.ValidationSummary(true)
• Html.ValidationSummary(true)
• Html.BeginForm()
• @Html.ActionLink(
"Treść linka",
"Nazwa Akcji",
new { /* id=Model.PrimaryKey */ } )
• @Html.ActionLink("Dodaj Studenta", "Create",
"Student")
Parametry routingu
Controller
@Html.BeginForm
@using (Html.BeginForm()) { <div>
<fieldset>
<legend>Account Information</legend>
<div class="editor-label">
@Html.LabelFor(m => m.UserName) </div>
<div class="editor-field">
@Html.TextBoxFor(m => m.UserName)
@Html.ValidationMessageFor(m => m.UserName) </div>
……….
<p>
<input type="submit" value="Log On" />
</p>
</fieldset>
</div>
}
BeginForm - cd
• BeginForm("Akcja", "Kontroler", …)
– Określenie routingu,
– Metody: Get, Post
PartialView
• Znacznik:
<div id="logindisplay">
@Html.Partial("_LogOnPartial") </div>
• Plik _LogOnPartia.cshtml
@if(Request.IsAuthenticated) {
<text>Welcome <strong>@User.Identity.Name</strong>!
[ @Html.ActionLink("Log Off", "LogOff", "Account") ]</text>
} else {
@:[ @Html.ActionLink("Log On", "LogOn", "Account") ]
}
Dostęp do danych
• DataBase First
• Model First
• Code First
Inne Metody Tworzenie aplikacji MVC
• Model First
a) Definicja modelu – w entity frameweork b) Tworzenie logiki biznesowej - generacja bazy danych
• DataBase First
a) Tworzenie bazy danych b) Generacja modelu EF
c) Tworzenie logiki biznesowej
Code First
• Własne obiekty
• Obiekty z Entity Framewerk
Własne obiety
public class BazaDanychPraktyk{
private List<Student> studenci;
public List<Student> Studenci{ get { return studenci; } set { studenci = value; } } private List<Umowa> umowy;
public List<Umowa> Umowy {get { return umowy; } set { umowy = value; } } private List<Firma> firmy;
public List<Firma> Firmy { get { return firmy; } set { firmy = value; } }
public BazaDanychPraktyk(){
studenci= new List<Student>(); firmy = new List<Firma>();
umowy= new List<Umowa>();
studenci.Add( new Student(){Imie="Andrzej", Nazwisko="Nowak", Indeksu="3456"});
studenci.Add( new Student(){Imie="Jan", Nazwisko="Kowalski",NrIndeksu="1234"});
firmy.Add(new Firma() { Nazwa = "Firma 1" });
firmy.Add(new Firma() { Nazwa = "Firma 2" });
firmy.Add(new Firma() { Nazwa = "Firma 3" });
umowy.Add(new Umowa() {Student= studenci[0], Firma=firmy[1],Id=1 });
} }
Code First
Definicja bazy
public class PraktykiDB: DbContext {
public DbSet<Student> Studenci { get; set; } public DbSet<Firma> Firmy { get; set; }
public DbSet<Umowa> Umowy { get; set; } }
Web.config
<configuration>
<connectionStrings>
<add name="PraktykiDB" connectionString="data
source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|
DataDirectory|PraktykiDB.mdf;User Instance=true;Initial Catalog=PraktykiDB;MultipleActiveResultSets=true"
providerName="System.Data.SqlClient" />
</connectionStrings>
CodeFirst - Inicjalizacja Bazy
class PraktykiDBInitializer : DropCreateDatabaseIfModelChanges<PraktykiStudenckie.Models.PraktykiDB>{
// DropCreateDatabaseAlways<PraktykiStudenckie.Models.PraktykiDB>
protected override void Seed(Models.PraktykiDB context) {
base.Seed(context);
context.Studenci.Add(new Student(){Imie = "Andrzej",Nazwisko ="Nowak", ...} );
context.Studenci.Add(new Student() {Imie = "Jan",Nazwisko ="Kowalski", ...} );
context.Firmy.Add(new Firma() { Nazwa = "Firma 1" });
context.Firmy.Add(new Firma() { Nazwa = "Firma 2" });
context.Firmy.Add(new Firma() { Nazwa = "Firma 3" });
context.SaveChanges();
context.Umowy.Add(new Umowa() {
Student = context.Studenci.First(), Firma = context.Firmy.First() });
context.SaveChanges();
} }