Transcript Wykład 7
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>
</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>
Nazwisko
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>
}
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 */ }
)
Parametry
routingu
• @Html.ActionLink("Dodaj Studenta", "Create",
"Student")
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();
}
Global.asax
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
Database.SetInitializer(new PraktykiDBInitializer());
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
Global.asax - cd
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
// Parameter defaults
);
}
Atrybuty Formatujące i
Walidujące
•
•
•
[Key]
[Display(Name = "Data Utworzenia")]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:d}")]
•
•
•
•
•
•
[Required]
[DataType(DataType.Date)]
[DataType(DataType.EmailAddress)]
[DataType(DataType.MultilineText)]
[DataType(DataType.Password)]
[DataType(DataType.PhoneNumber)]
Inne Mechanizmy walidacji