Model
using System.ComponentModel.DataAnnotations;
namespace TallinnaRakenduslikKolledz.Models
{
public class Instructor
{
[Key]
public int InstructorID { 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 LastName + ", " + FirstName; }
}
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}")]
[Display(Name = "Tööleasumiskuupäev")]
public DateTime HireDate { get; set; }
public ICollection<CourseAssignment>? CourseAssignments { get; set; }
public OfficeAssignment? OfficeAssignment { get; set; }
[Display(Name = "Palk")]
public int? Salary { get; set; }
[Display(Name = "Vanus")]
public int? Age { get; set; }
[Display(Name = "Sugu")]
public string? Gender { get; set; }
}
}
See klass määrab õpetaja põhiandmed nagu eesnimi, perekonnanimi, tööleasumise kuupäev, palk, vanus ja sugu.
Klass sisaldab ka seoseid kursuste ja kabinetiga.
Controller
using System.Reflection;
using System.Threading.Tasks;
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, string selectedCourses)
{
if (selectedCourses != null)
{
instructor.CourseAssignments = new List<CourseAssignment>();
foreach (var course in selectedCourses)
{
var courseToAdd = new CourseAssignment
{
InstructorID = instructor.InstructorID,
CourseID = course
};
instructor.CourseAssignments.Add(courseToAdd);
}
}
ModelState.Remove("selectedCourses");
if (ModelState.IsValid)
{
_context.Add(instructor);
await _context.SaveChangesAsync();
return RedirectToAction("Index");
}
// PopulateAssignedCourseData(instructor);
return View(instructor);
}
[HttpGet]
public async Task<IActionResult> Delete(int? id, bool? saveChangesError = false)
{
if (id == null)
{
return NotFound();
}
var deletableInstructor = await _context.Instructors
.FirstOrDefaultAsync(s => s.InstructorID == id);
if (deletableInstructor == null)
{
return NotFound();
}
return View(deletableInstructor);
}
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
Instructor deletableInstructor = await _context.Instructors
.SingleAsync(i => i.InstructorID == id);
_context.Instructors.Remove(deletableInstructor);
await _context.SaveChangesAsync();
return RedirectToAction("Index");
}
[HttpGet]
public async Task<IActionResult> Edit(int? ID)
{
var instructor = await _context.Instructors.FirstOrDefaultAsync(m => m.InstructorID == ID);
if (ID == null)
{
return NotFound();
}
if (instructor == null)
{
return NotFound();
}
_context.Instructors.Update(instructor);
return View(instructor);
}
[HttpPost, ValidateAntiForgeryToken, ActionName("Edit")]
public async Task<IActionResult> EditConfirmed(int ID, [Bind("ID, LastName, FirstName")] Instructor instructor)
{
_context.Instructors.Update(instructor);
await _context.SaveChangesAsync();
return RedirectToAction("Index");
}
[HttpGet]
public async Task<IActionResult> Details(int? id)
{
var instructor = await _context.Instructors.FirstOrDefaultAsync(m => m.InstructorID == id);
return View(instructor);
}
}
}
InstruktorsController vastutab õpetajatega seotud tegevuste eest.
See kontrollib kasutaja päringuid, suhtleb andmebaasiga läbi SchoolContext ning suunab kasutaja vastavatesse vaadetesse.
Index
Laeb kõik õpetajad andmebaasist ja saadab need vaatesse.
Kasutab LINQ meetodeid Include() OfficeAssignment ja CourseAssignments kaasalaadmiseks ning ToListAsync(), et tuua kõik kirjed.
Create (GET)
Avab vaate uue õpetaja lisamiseks ja valmistab ette kursuste seose jaoks vajaliku objekti.
Create (POST)
Lisab uue õpetaja ning seob ta valitud kursustega.
Kursuste sidumiseks luuakse CourseAssignment objektid.
Kui andmed on korrektsed, salvestatakse need SaveChangesAsync() abil.
Delete (GET)
Leiab õpetaja ID järgi ja kuvab kustutamise kinnituse.
Kasutab FirstOrDefaultAsync() LINQ meetodit ning lambda avaldis õpetaja leidmiseks.
DeleteConfirmed (POST)
Kustutab õpetaja andmebaasist.
Kasutab SingleAsync(), et leida täpselt üks vastav õpetaja.
Edit (GET)
Leiab muudetava õpetaja ID alusel ja avab muutmise vaate.
Kasutab FirstOrDefaultAsync() LINQ meetodit.
EditConfirmed (POST)
Salvestab muudetud õpetaja andmed andmebaasi ja suunab tagasi Index vaatesse.
Details
Kuvab ühe konkreetse õpetaja detailinfo.
Õpetaja leitakse LINQ meetodiga FirstOrDefaultAsync().
Vaated
Index
@model TallinnaRakenduslikKolledz.Models.InstructorIndexData
@{
ViewData["Title"] = "Õpetajad";
}
<h2>Õpetaja</h2>
<p>
<a asp-action="Create">Lisa Õpetaja</a>
</p>
<table class="table">
<thead>
<tr>
<th>Perekonnanimi</th>
<th>Eesnimi</th>
<th>Töölevõtukuupäev</th>
<th>Palk</th>
<th>Sugu</th>
<th>Vanus</th>
</tr>
</thead>
<tbody>
@foreach(var instructor in Model.Instructors)
{
string selectedRow = "";
if (instructor.InstructorID == (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.HireDate)</td>
<td>@Html.DisplayFor(modelItem => instructor.Salary)</td>
<td>@Html.DisplayFor(modelItem => instructor.Gender)</td>
<td>@Html.DisplayFor(modelItem => instructor.Age)</td>
<td>
<a asp-action="Delete" asp-route-id="@instructor.InstructorID">Kustuta</a>
<a asp-action="Edit" asp-route-id="@instructor.InstructorID">Muuda</a>
<a asp-action="Details" asp-route-id="@instructor.InstructorID">Vaata</a>
</td>
</tr>
}
</tbody>
</table>
Create
@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="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="Gender"></label>
<input asp-for="Gender" class="form-control" />
<span asp-validation-for="Gender" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Age"></label>
<input asp-for="Age" class="form-control" />
<span asp-validation-for="Age" 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>
<div class="form-group">
<label asp-for="HireDate"></label>
<input asp-for="HireDate" class="form-control" />
<span asp-validation-for="HireDate" class="text-danger"></span>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<table>
<tr>
@{
int count = 0;
List<TallinnaRakenduslikKolledz.Models.AssignedCourseData> assignedCourses = ViewBag.Courses;
if (assignedCourses != null)
{
foreach (var course in assignedCourses)
{
if (count++ % 3 == 0)
{
@:</tr><tr>
}
@:<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>
Delete
@model TallinnaRakenduslikKolledz.Models.Instructor
@{
ViewData["Title"] = "Kustuta õpetaja";
}
<h1>Kustuta õpetaja</h1>
<h3>Kas soovid kustutada @Html.DisplayFor(model =>model.FullName)</h3>
<div>
<h4>Õpetaja</h4>
<hr />
<dl class="row">
<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.LastName)</dt>
<dt class="col-sm-2">@Html.DisplayFor(Model => Model.LastName)</dt>
<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.FirstName)</dt>
<dt class="col-sm-2">@Html.DisplayFor(Model => Model.FirstName)</dt>
<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.CourseAssignments)</dt>
<dt class="col-sm-2">@Html.DisplayFor(Model => Model.CourseAssignments)</dt>
<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.OfficeAssignment)</dt>
<dt class="col-sm-2">@Html.DisplayFor(Model => Model.OfficeAssignment)</dt>
<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.Age)</dt>
<dt class="col-sm-2">@Html.DisplayFor(Model => Model.Age)</dt>
<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.Gender)</dt>
<dt class="col-sm-2">@Html.DisplayFor(Model => Model.Gender)</dt>
<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.Salary)</dt>
<dt class="col-sm-2">@Html.DisplayFor(Model => Model.Salary)</dt>
<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.HireDate)</dt>
<dt class="col-sm-2">@Html.DisplayFor(Model => Model.HireDate)</dt>
</dl>
<form asp-action="Delete">
<input type="hidden" asp-for="InstructorID"/>
<input type="submit" value="Kustuta" class="btn btn-danger"/>|<a asp-action="index">Tühista</a>
</form>
</div>
Edit
@model TallinnaRakenduslikKolledz.Models.Instructor
@{
ViewData["Title"] = "Muuda õpetajat";
}
<h1>Muuda õpilase andmeid</h1>
<hr />
<div Class="row">
<div class="col-md-4">
<form asp-action="Edit">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<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">
<input type="submit" value="Muuda" class="btn btn-primary" />
</div>
</form>
</div>
</div>
<div>
<a asp-action="Index">Mine tagasi loendisse </a>
</div>
Details
@model TallinnaRakenduslikKolledz.Models.Instructor
@{
ViewData["Title"] = "Vaata õpetaja andmed";
}
<h1>Õpilase andmed</h1>
<div>
<h4>Õpilane @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.Gender)</dt>
<dd class="col-sm-10">@Html.DisplayFor(Model => Model.Gender)</dd>
</dl>
<dl class="row">
<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.Age)</dt>
<dd class="col-sm-10">@Html.DisplayFor(Model => Model.Age)</dd>
</dl>
<dl>
<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.HireDate)</dt>
<dd class="col-sm-10">@Html.DisplayFor(Model => Model.HireDate)</dd>
</dl>
<dl>
<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.CourseAssignments)</dt>
<dd class="col-sm-10">@Html.DisplayFor(Model => Model.CourseAssignments)</dd>
</dl>
</div>
<div>
<a asp-action="Index">Mine tagasi loendisse</a>
</div>