Instructors mudel
using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Mvc;
namespace TallinnaRakenduslikKolllež.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 LastName + ", " + FirstName; }
}
/**/
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}")]
[Display(Name = "Tööleasumiskuupäev")]
public DateTime HiredDate { get; set; }
public ICollection<CourseAssignment>? CourseAssignments { get; set; }
public OfficeAssignment? OfficeAssignments { 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; }
}
}
View:
Index View- kuvab tähtsamad andmed ja funktsioonide nupud.
@model TallinnaRakenduslikKolllež.Models.InstructorIndexData
@{
ViewData["Title"] = "Õpetajad";
}
<h2>Õpetajad</h2>
<p>
<a asp-action="Create">Lisa Õpetaja</a>
</p>
<table class="table">
<thead>
<tr>
<th>Perekonnanimi</th>
<th>Eesnimi</th>
<th>Töötevõtukuupäev</th>
<th>Kabinet</th>
<th>Palk</th>
<th>Ruumi number</th>
<th>E-mail</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.HiredDate)</td>
<td>
@if (instructor.OfficeAssignments != null)
{
@instructor.OfficeAssignments.Location
}
</td>
<td>@Html.DisplayFor(ModelItem => instructor.Salary)</td>
<td>@Html.DisplayFor(ModelItem => instructor.RoomID)</td>
<td>@Html.DisplayFor(ModelItem => instructor.Email)</td>
<td>
<a asp-action="Delete" asp-route-id="@instructor.ID">Kustuta</a>
<a asp-action="Edit" asp-route-id="@instructor.ID">Edit</a>
<a asp-action="Details" asp-route-id="@instructor.ID">Details</a>
</td>
</tr>
}
</tbody>
</table>
Create View – vaade laseb luua uued õpetajad
@model TallinnaRakenduslikKolllež.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="HiredDate"></label>
<input asp-for="HiredDate" class="form-control"/>
<span asp-validation-for="HiredDate" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="OfficeAssignments"></label>
<input asp-for="OfficeAssignments" class="form-control"/>
<span asp-validation-for="OfficeAssignments" 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>
@* lisage mudelist teiste andmete jaoks ka sisendiplokk*@
<div class="form-group">
<div class="col-mdoffset-2 col-md-10">
<table>
<tr>
@{
int count = 0;
List<TallinnaRakenduslikKolllež.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>
<input type="submit" value="Sisesta" class="btn btn-primary"/>
</div>
<div>
<a asp-action="Index" class="btn btn-danger">Tühista lisamine</a>
</div>
</div>
</div>
</form>
</div>
</div>
Delete View- kuvab andmed ja delete nupu
@model TallinnaRakenduslikKolllež.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.HiredDate)</dt>
<dt class="col-sm-2">@Html.DisplayFor(model => model.HiredDate)</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.Salary)</dt>
<dt class="col-sm-2">@Html.DisplayFor(model => model.Salary)</dt>
<dt class="col-sm-2">@Html.DisplayNameFor(model => model.RoomID)</dt>
<dt class="col-sm-2">@Html.DisplayFor(model => model.RoomID)</dt>
<dt class="col-sm-2">@Html.DisplayNameFor(model => model.Email)</dt>
<dt class="col-sm-2">@Html.DisplayFor(model => model.Email)</dt>
</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>
Details View – kuvab kõik andmed
@model TallinnaRakenduslikKolllež.Models.Instructor
@{
ViewData["Title"] = "Details";
}
<h1>Details</h1>
<h4>Instructors</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.HiredDate) </dt>
<dd class="col-sm-10"> @Html.DisplayFor(Model => Model.HiredDate)</dd>
</dl>
<dl class="row">
<dt class="col-sm-2"> @Html.DisplayNameFor(Model => Model.OfficeAssignments) </dt>
<dd class="col-sm-10"> @Html.DisplayFor(Model => Model.OfficeAssignments)</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>
<div>
<a asp-action="Index">Mine tagasi loendisse</a>
</div>
Edit view- kuvab kõik andmed ja saad neid konfigureerida
@model TallinnaRakenduslikKolllež.Models.Instructor
@{
ViewData["Title"] = "Edit";
}
<h1>Edit</h1>
<h4>Instructors</h4>
<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">
<label asp-for="HiredDate" class="control-label"></label>
<input asp-for="HiredDate" class="form-control" />
<span asp-validation-for="HiredDate" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="OfficeAssignments" class="control-label"></label>
<input asp-for="OfficeAssignments" class="form-control" />
<span asp-validation-for="OfficeAssignments" 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>
Controller:
andmebaasi kontekst – SchoolContext on Entity Frameworki DbContext. Dependency Injectioni tehakse sellele autamaatselt
private readonly SchoolContext _context;
public InstructorsController(SchoolContext context)
{
_context = context;
}
Index – Pärib kõik andmed ja kuvab need
public async Task<IActionResult> Index(int? id, int? courseId)
{
var vm = new InstructorIndexData();
vm.Instructors = await _context.Instructors
.Include(i => i.OfficeAssignments)
.Include(i => i.CourseAssignments)
.ToListAsync();
return View(vm);
}
HTTPGet Create – loob uue tühja Create vormi
[HttpGet]
public IActionResult Create()
{
var instructor = new Instructor();
instructor.CourseAssignments = new List<CourseAssignment>();
return View(instructor);
}
HTTPPost Create – salvestab andmed andmebaasi ja saadab indexi.
[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.ID,
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 Delete – pärib kõik andmed Id järgi ja kuvab need
[HttpGet]
public async Task<IActionResult> Delete(int? id, bool? saveChangesError = false)
{
if (id == null)
{
return NotFound();
}
var deletableInstructor = await _context.Instructors
.FirstOrDefaultAsync(s => s.ID == id);
if (deletableInstructor == null)
{
return NotFound();
}
return View(deletableInstructor);
}
HTTPPost Delete – Valideerib turvalisust, kustutab andmed Id järgi ja saadab indexi
[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");
}
Details – pärib kõik andmed ja kuvab need
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var instructor = await _context.Instructors.FirstOrDefaultAsync(x => x.ID == id);
if (instructor == null)
{
return NotFound();
}
return View(instructor);
}
HTTPGet Edit – pärib andmed ja kuvab need Id järgi, kui ei leia kuvab not found.
[HttpGet, ActionName("Edit")]
public async Task<IActionResult> Edit(int? id)
{
if (id == null)
{
return NotFound();
}
var instructor = await _context.Instructors.FirstOrDefaultAsync(x => x.ID == id);
if (instructor == null)
{
return NotFound();
}
return View(instructor);
}
HTTPPost Edit- kontrollib turvalisust, andmete korrektsust ja salvestab andmebaasi
[HttpPost, ActionName("Edit")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> EditConfirmed([Bind("ID,LastName,FirstName,HiredDate,OfficeAssignment,Salary,RoomId,Email,")] Instructor instructor)
{
if (ModelState.IsValid)
{
_context.Instructors.Update(instructor);
await _context.SaveChangesAsync();
return RedirectToAction("Index");
}
return RedirectToAction("Index");
}
PopulateAssignedCourseData – loob listi kursustest ja märgib, millised on õpetajale määratud.
private void PopulateAssignedCourseData(Instructor instructor)
{
var allCourses = _context.Courses; // leiame kõik kursused
var instructorCourses = new HashSet<int>(instructor.CourseAssignments.Select(c => c.CourseID));
// valime kursused kus courseid on õpetajal olemas
var vm = new List<AssignedCourseData>();
foreach (var course in allCourses)
{
vm.Add(new AssignedCourseData
{
CourseID = course.CourseID,
Title = course.Title,
Assigned = instructorCourses.Contains(course.CourseID)
});
}
ViewData["Courses"] = vm;
}