Instructor model: Andmed
using System.ComponentModel.DataAnnotations;
namespace TallinnaRakenduslikKolledz.Models
{
public class Instructor
{
[Key]
public int ID { get; set; }
/**/
[Required]
[StringLength(50)]
[Display(Name = "Perekonnanimi")]
public string LastName { get; set; }
/**/
[Required]
[StringLength(50)]
[Display(Name = "Eesnimi")]
public string FirstName { get; set; }
/**/
[Display(Name = "Õpetaja nimi")]
public string FullName
{
get { return FirstName + " " + LastName; }
}
/**/
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}")]
[Display(Name = "Tööleasumiskuupäev")]
public DateTime HirdeDate { get; set; }
public ICollection<CourseAssignment>? CourseAssignments { get; set; }
public OfficeAssignment? OfficeAssignment { get; set; }
/**/
[Display(Name = "Palk")]
public int? Salary { get; set; }
[Display(Name = "Ruumi number")]
public int? RoomID { get; set; }
[Display(Name = "Email")]
public string? Email { get; set; }
}
}
Instuctor View kasutas on 5 vaadet: Index, Create, Delete, Details, Edit.
Instructor Index on pea vaade kui lähed “Õpetaja” lehele
@model TallinnaRakenduslikKolledz.Models.InstructorIndexData
@{
ViewData["Title"] = "Õpetajad";
}
<h2>Õpetajad</h2>
<p>
<a asp-action="Create">Lisa Õpetaja</a>
</p>
<table class="table table-sm">
<thead>
<tr>
<th>Perekonnanimi</th>
<th>Eesnimi</th>
<th>Töötevõtukuupäev</th>
<th>Kabinet</th>
<th>Kursused</th>
<th>Palk</th>
<th>Ruumi number</th>
<th>Tööriistad</th>
</tr>
</thead>
<tbody>
@foreach (var instructor in Model.Instructors)
{
string selectedRow = "";
if (instructor.ID == (int?)ViewData["InstructorID"])
{
selectedRow = "table-success";
}
<tr class="@selectedRow">
<td>@Html.DisplayFor(modelItem => instructor.LastName)</td>
<td>@Html.DisplayFor(modelItem => instructor.FirstName)</td>
<td>@Html.DisplayFor(modelItem => instructor.HirdeDate)</td>
<td>
@if (instructor.OfficeAssignment != null)
{
@instructor.OfficeAssignment.Location
}
</td>
<td>
@foreach (var course in instructor.CourseAssignments)
{
@course.Course.ID @: @course.Course.Title <br />
}
</td>
<td>@Html.DisplayFor(modelItem => instructor.Salary)</td>
<td>@Html.DisplayFor(modelItem => instructor.RoomID)</td>
<td>
<a asp-action="Edit" asp-route-id="@instructor.ID">Muuda</a> |
<a asp-action="Details" asp-route-id="@instructor.ID">Vaata</a> |
<a asp-action="Delete" asp-route-id="@instructor.ID">Kustuta</a>
</td>
</tr>
}
</tbody>
</table>
Instructor Create vaade laseb õpetajaid lisada Indexi.
@model TallinnaRakenduslikKolledz.Models.Instructor
@{
ViewData["Title"] = "Lisa õpetaja";
}
<h1>Lisa Õpetaja</h1>
<h4></h4>
<hr />
<div class="row">
<div class="col-md-8">
<form asp-action="Create">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="LastName"></label>
<input asp-for="LastName" class="form-control"/>
<span asp-validation-for="LastName" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="FirstName"></label>
<input asp-for="FirstName" class="form-control"/>
<span asp-validation-for="FirstName" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="HirdeDate"></label>
<input asp-for="HirdeDate" class="form-control"/>
<span asp-validation-for="HirdeDate" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Salary"></label>
<input asp-for="Salary" class="form-control"/>
<span asp-validation-for="Salary" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="RoomID"></label>
<input asp-for="RoomID" class="form-control"/>
<span asp-validation-for="RoomID" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Email"></label>
<input asp-for="Email" class="form-control"/>
<span asp-validation-for="Email" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="OfficeAssignment"></label>
<input asp-for="OfficeAssignment" class="form-control"/>
<span asp-validation-for="OfficeAssignment" class="text-danger"></span>
</div>
@* lisage mudelist teiste andmete jaoks ka sisendiplokk // *@
<div class="form-group">
<div class="col-md-offset-2">
<table>
<tr>
@{
int count = 0;
List<TallinnaRakenduslikKolledz.Models.AssignedCourseData> assignedCourses = ViewBag.Courses;
if(assignedCourses != null)
{
foreach (var course in assignedCourses)
{
if (count++ % 3 == 0)
{
@:</td><td>
}
@:<td>
<input
type="checkbox"
name="selectedCourses"
value="@course.CourseID"
@(Html.Raw(course.Assigned ? "checked=\"checked\"" : ""))
/>
}
}
else
{
@:Kursuseid ei leitud
}
}
</tr>
</table>
</div>
</div>
<div>
<input type="submit" value="Sisesta" class="btn btn-primary"/>
</div>
<div>
<a asp-action="Index" class="btn btn-danger">Tühista lisamine</a>
</div>
</form>
</div>
</div>
Instructor Delete vaade laseb õpetajaid kustutada.
@model TallinnaRakenduslikKolledz.Models.Instructor
@{
ViewData["Title"] = "Kustuta õpetaja";
}
<h1>Kustuta Õpetaja</h1>
<h3>Kas soovid kustudada õpetaja</h3>
<div>
<h4>@Html.DisplayFor(Model => Model.FullName)</h4>
<hr />
<dl class="row">
<dt class="col-sm-2">@Html.DisplayNameFor(model => model.LastName)</dt>
<dd class="col-sm-10">@Html.DisplayFor(model => model.LastName)</dd>
</dl>
<dl class="row">
<dt class="col-sm-2">@Html.DisplayNameFor(model => model.FirstName)</dt>
<dd class="col-sm-10">@Html.DisplayFor(model => model.FirstName)</dd>
</dl>
<dl class="row">
<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.HirdeDate)</dt>
<dt class="col-sm-2">@Html.DisplayFor(Model => Model.HirdeDate)</dt>
</dl>
<dl class="row">
<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.Salary)</dt>
<dt class="col-sm-2">@Html.DisplayFor(Model => Model.Salary)</dt>
</dl>
<dl class="row">
<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.RoomID)</dt>
<dt class="col-sm-2">@Html.DisplayFor(Model => Model.RoomID)</dt>
</dl>
<dl class="row">
<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.Email)</dt>
<dt class="col-sm-2">@Html.DisplayFor(Model => Model.Email)</dt>
</dl>
</dl>
<form asp-action="Delete">
<input type="hidden" asp-for="ID" />
<input type="submit" value="Kustuta" class="btn btn-danger" /><a asp-action="Index">Tühista</a>
</form>
</div>
Instructor Details vaade laseb õpetajaid admeid vaatada.
@model TallinnaRakenduslikKolledz.Models.Instructor
@{
ViewData["Title"] = "Õpetaja vaade";
}
<h1>Õpetaja vaade</h1>
<div>
<h4>Õpetaja @Model.FirstName @Model.LastName</h4>
<hr />
<dl class="row">
<dt class="col-sm-2">@Html.DisplayNameFor(model => model.LastName)</dt>
<dd class="col-sm-10">@Html.DisplayFor(model => model.LastName)</dd>
</dl>
<dl class="row">
<dt class="col-sm-2">@Html.DisplayNameFor(model => model.FirstName)</dt>
<dd class="col-sm-10">@Html.DisplayFor(model => model.FirstName)</dd>
</dl>
<dl class="row">
<dt class="col-sm-2">@Html.DisplayNameFor(model => model.HirdeDate)</dt>
<dd class="col-sm-10">@Html.DisplayFor(model => model.HirdeDate)</dd>
</dl>
<dl class="row">
<dt class="col-sm-2">@Html.DisplayNameFor(model => model.Salary)</dt>
<dd class="col-sm-10">@Html.DisplayFor(model => model.Salary)</dd>
</dl>
<dl class="row">
<dt class="col-sm-2">@Html.DisplayNameFor(model => model.RoomID)</dt>
<dd class="col-sm-10">@Html.DisplayFor(model => model.RoomID)</dd>
</dl>
<dl class="row">
<dt class="col-sm-2">@Html.DisplayNameFor(model => model.Email)</dt>
<dd class="col-sm-10">@Html.DisplayFor(model => model.Email)</dd>
</dl>
@if (Model.CourseAssignments != null)
{
foreach (var courseAssignment in Model.CourseAssignments)
{
<dl class="row">
<dd class="col-sm-10">@(courseAssignment)</dd>
</dl>
}
}
</div>
<div>
<a asp-action="Index">Mine tagasi loendisse</a>
</div>
Instructor Edit vaade laseb õpetaja andmeid muuta.
@model TallinnaRakenduslikKolledz.Models.Instructor
@{
ViewData["Title"] = "Muuda Õpetaja";
}
<h1>Muuda Õpetaja</h1>
<hr />
<div class="row">
<div class="col-md-4">
<form asp-action="Edit">
<div asp-validation-summary="ModelOnly" class="=text-danger"></div>
<input asp-for="ID" type="hidden" />
<div class="form-group">
<label asp-for="LastName" class="control-label"></label>
<input asp-for="LastName" class="form-control" />
<span asp-validation-for="LastName" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="FirstName" class="control-label"></label>
<input asp-for="FirstName" class="form-control" />
<span asp-validation-for="FirstName" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="HirdeDate" class="control-label"></label>
<input asp-for="HirdeDate" class="form-control" />
<span asp-validation-for="HirdeDate" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Salary" class="control-label"></label>
<input asp-for="Salary" class="form-control" />
<span asp-validation-for="Salary" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="RoomID" class="control-label"></label>
<input asp-for="RoomID" class="form-control" />
<span asp-validation-for="RoomID" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Email" class="control-label"></label>
<input asp-for="Email" class="form-control" />
<span asp-validation-for="Email" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="Sisesta" class="btn btn-primary" />
</div>
</form>
</div>
</div>
<div>
<a asp-action="Index">Mine tagasi loendisse</a>
</div>
Controllers:
Seda kasutatakse, et kuvada õpetaja nimekirja, lisada uusi õpetajaid, muuda olemasolevaid õpetajaid, näitada õpetaja detaile ja kustutada õpetajaid
using System.Reflection;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using TallinnaRakenduslikKolledz.Data;
using TallinnaRakenduslikKolledz.Models;
namespace TallinnaRakenduslikKolledz.Controllers
{
public class InstructorsController : Controller
{
private readonly SchoolContext _context;
public InstructorsController(SchoolContext context)
{
_context = context;
}
public async Task<IActionResult> Index(int? Id, int? courseId)
{
var vm = new InstructorIndexData();
vm.Instructors = await _context.Instructors
.Include(i => i.OfficeAssignment)
.Include(i => i.CourseAssignments)
.ToListAsync();
return View(vm);
}
[HttpGet]
public IActionResult Create()
{
var instructor = new Instructor();
instructor.CourseAssignments = new List<CourseAssignment>();
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(Instructor instructor, int[] selectedCourses)
{
instructor.CourseAssignments = new List<CourseAssignment>();
if (selectedCourses != null)
{
foreach (var courseId in selectedCourses)
{
instructor.CourseAssignments.Add(new CourseAssignment
{
CourseID = courseId,
InstructorID = instructor.ID
});
}
}
if (ModelState.IsValid)
{
_context.Add(instructor);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
PopulateAssignedCourseData(instructor);
return View(instructor);
}
[HttpGet]
public async Task<IActionResult> Edit(int? ID)
{
if (ID == null)
{
return NotFound();
}
var instructor = await _context.Instructors.FindAsync(ID);
if (instructor == null)
{
return NotFound();
}
return View(instructor);
}
[HttpPost, ActionName("Edit")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int ID, [Bind("ID,LastName,FirstName,HirdeDate,Salary,RoomID,Email")] Instructor instructor)
{
if (ID != instructor.ID)
{
return NotFound();
}
if (ModelState.IsValid)
{
_context.Instructors.Update(instructor);
await _context.SaveChangesAsync();
return RedirectToAction("Index");
}
return View(instructor);
}
[HttpGet]
public async Task<IActionResult> Delete(int? id, bool? saveChangesError = false)
{
if (id == null)
{
return NotFound();
}
var deleteableInstructor = await _context.Instructors
.FirstOrDefaultAsync(s => s.ID == id);
if (deleteableInstructor == null)
{
return NotFound();
}
return View(deleteableInstructor);
}
[HttpGet]
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var instructor = await _context.Instructors.FirstOrDefaultAsync(s => s.ID == id);
if (instructor == null)
{
return NotFound();
}
return View(instructor);
}
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
Instructor deletableInstructor = await _context.Instructors
.SingleAsync(i => i.ID == id);
_context.Instructors.Remove(deletableInstructor);
await _context.SaveChangesAsync();
return RedirectToAction("Index");
}
private void PopulateAssignedCourseData(Instructor instructor)
{
var allCourses = _context.Courses; //leiame koik kursused
var instructorCourses = new HashSet<int>(instructor.CourseAssignments.Select(c => c.CourseID));
// valime kursused kus courseid on opetajal olemas
var vm = new List<AssignedCourseData>();
foreach (var course in allCourses)
{
vm.Add(new AssignedCourseData()
{
CourseID = course.ID,
Title = course.Title,
Assigned = instructorCourses.Contains(course.ID)
});
}
ViewData["Courses"] = vm;
}
}
}
Andmebaasi kontekst
private readonly SchoolContext _context;
public InstructorsController(SchoolContext context)
{
_context = context;
}
SchoolContext on Entity Frameworki DbContext
Dependency Injectioni tehakse sellele autamaatselt
_context.Instructors tähendab instructor tabeli
Index
public async Task<IActionResult> Index(int? Id, int? courseId)
{
var vm = new InstructorIndexData();
vm.Instructors = await _context.Instructors
.Include(i => i.OfficeAssignment)
.Include(i => i.CourseAssignments)
.ToListAsync();
return View(vm);
}
Näitab kõik õpetajad nimekirjas koos OfficeAssignment ja CourseAssignment’iga saadab andmed vaatesse
Create Get
[HttpGet]
public IActionResult Create()
{
var instructor = new Instructor();
instructor.CourseAssignments = new List<CourseAssignment>();
return View();
}
Kuvab tühja vormi uue õpetaja lisamiseks
Create Post
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(Instructor instructor, int[] selectedCourses)
{
instructor.CourseAssignments = new List<CourseAssignment>();
if (selectedCourses != null)
{
foreach (var courseId in selectedCourses)
{
instructor.CourseAssignments.Add(new CourseAssignment
{
CourseID = courseId,
InstructorID = instructor.ID
});
}
}
salvestab õpetaja andmebaasi ja lisab valitud kursused:
Edit Get
[HttpGet]
public async Task<IActionResult> Edit(int? ID)
{
if (ID == null)
{
return NotFound();
}
var instructor = await _context.Instructors.FindAsync(ID);
if (instructor == null)
{
return NotFound();
}
return View(instructor);
}
Meetod kus kontrollitakse kas õpetaja id on olemas kui on saadetakse vaatesse
Edit Post
[HttpPost, ActionName("Edit")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int ID, [Bind("ID,LastName,FirstName,HirdeDate,Salary,RoomID,Email")] Instructor instructor)
{
if (ID != instructor.ID)
{
return NotFound();
}
if (ModelState.IsValid)
{
_context.Instructors.Update(instructor);
await _context.SaveChangesAsync();
return RedirectToAction("Index");
}
return View(instructor);
}
Meetod kus kontrollitakse kas turvaparameetrid ja õpetaka ID kattuvad, valideeridakse sisestatud andmed ja salvestatakse asünkroonselt andmebaasi ning suunadakse õpetaja nimekirja
Details Get
[HttpGet]
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var instructor = await _context.Instructors.FirstOrDefaultAsync(s => s.ID == id);
if (instructor == null)
{
return NotFound();
}
return View(instructor);
}
Meetod kus kuvatakse ühe õpetaka andmeid id järgi
Delete Get
[HttpGet]
public async Task<IActionResult> Delete(int? id, bool? saveChangesError = false)
{
if (id == null)
{
return NotFound();
}
var deleteableInstructor = await _context.Instructors
.FirstOrDefaultAsync(s => s.ID == id);
if (deleteableInstructor == null)
{
return NotFound();
}
return View(deleteableInstructor);
}
Meetod kus kuvatakse Delete vaadet id järgi
Delete Post
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
Instructor deletableInstructor = await _context.Instructors
.SingleAsync(i => i.ID == id);
_context.Instructors.Remove(deletableInstructor);
await _context.SaveChangesAsync();
return RedirectToAction("Index");
}
Meetod kus leitakse õpetaja id järgi ja eemaldatakse andmebaasist siis salvetatakse muudatused ja suunatakse tagasi õpilase nimekirja
Abimeetod PopulateAssignedCourseData loob listi kursustest ja märgib, millised on õpetajale määratud:
private void PopulateAssignedCourseData(Instructor instructor)
{
var allCourses = _context.Courses; //leiame koik kursused
var instructorCourses = new HashSet<int>(instructor.CourseAssignments.Select(c => c.CourseID));
// valime kursused kus courseid on opetajal olemas
var vm = new List<AssignedCourseData>();
foreach (var course in allCourses)
{
vm.Add(new AssignedCourseData()
{
CourseID = course.ID,
Title = course.Title,
Assigned = instructorCourses.Contains(course.ID)
});
}
ViewData["Courses"] = vm;
}