Õpetajad

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;

        }