Instructors Controller, Mudel ja View

Controller

SchoolContext _context annab Controllerile ja Vaatele teada mis andmebaas välja näeb ning kõik informatsioon selle sees.

Index laseb meil vaadata kõik Instructors informatsiooni üldiselt kasutades ToListAsync() meetodit mis paneb kõik raamatud tabelisse.

Create esimesena annab meile Create vaate ning siis kui on informatsioon antud, see kontrollib et mudel on õige ning kui on, lisab andmebaasile ja viib sind tagasi Indexisse.
See kasutab ka SaveChangesAsync et salvestada informatsiooni

Delete kustutab antud valik ära peale kui kontrollib et asi on olemas. see kasutab esimesena FirstorDefaultAsync, mis Tagastab asünkroonselt jada esimese elemendi. Ning kasutab Lambda meetodit et lühidalt näidata anonüümset meetodit.
Ning siis salvestab andmebaasi peale kui kustutab valitud objekt ära.

Details lubab meil vaadata täpsemad informatsiooni antud objekti kohta. See kasutab samuti FirstorDefaultAsync ja Lambda meetodit.

Edit lubab meil muuta antud objekti. Kasutab FirstorDefaultAsync ja Lambda meetodit. Sellel on ka post-meetod mis siis salvestab kõike mis muudeti.

QuickEdit ka töötab samamoodi kui Edit.

using TallinnaRakenduslikKolledzKaur.Data;
using Microsoft.AspNetCore.Mvc;
using TallinnaRakenduslikKolledzKaur.Models;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using System.Reflection;

namespace TallinnaRakenduslikKolledzKaur.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>();
                if (selectedCourses != null)
                {
                    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);
        }
        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;
        }
        [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, 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");
        }
        [HttpGet]
        public async Task<IActionResult> Details(int? Id)
        {
            if (Id == null)
            {
                return NotFound();
            }
            var instructor = await _context.Instructors.FirstOrDefaultAsync(m => m.Id == Id);
            if (instructor == null)
            {
                return NotFound();
            }
            return View(instructor);
        }
        [HttpGet]
        public async Task<IActionResult> Edit(int? Id)
        {
            if (Id == null)
            {
                return NotFound();
            }
            var instructor = await _context.Instructors.FirstOrDefaultAsync(m => m.Id == Id);
            if (instructor == null)
            {
                return NotFound();
            }
            _context.Instructors.Update(instructor);
            return View(instructor);
        }
        [HttpPost, ActionName("Edit")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> EditConfirmed([Bind("Id,LastName,FirstName,HireDate,CourseAssignments,OfficeAssignment,VacationDays,Comments,BirthDate,Status")] Instructor instructor)
        {
            _context.Instructors.Update(instructor);
            await _context.SaveChangesAsync();
            return RedirectToAction("Index");
        }
        public async Task<IActionResult> Quickedit(int? Id)
        {
            if (Id == null)
            {
                return NotFound();
            }
            var instructor = await _context.Instructors.FirstOrDefaultAsync(m => m.Id == Id);
            if (instructor == null)
            {
                return NotFound();
            }
            _context.Instructors.Update(instructor);
            return View(instructor);
        }
        [HttpPost, ActionName("Quickedit")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> QuickeditConfirmed([Bind("Id,LastName,FirstName,HireDate,CourseAssignments,OfficeAssignment,VacationDays,Comments,BirthDate,Status")] Instructor instructor)
        {
            _context.Instructors.Update(instructor);
            await _context.SaveChangesAsync();
            return RedirectToAction("Index");
        }
    }
}

Mudel

using System.ComponentModel.DataAnnotations;

namespace TallinnaRakenduslikKolledzKaur.Models
{
    public class Department
    {
        [Key]
        public int DepartmentID { get; set; }
        public string Name { get; set; }
        public decimal Budget { get; set; }
        public DateTime StartDate { get; set; }
        public int? InstructorID { get; set; }
        public Instructor? Administrator { get; set; }
        public ICollection<Course>? Courses { get; set; }
        public byte? RowVersion { get; set; }
        public int? Staplers { get; set; }
        public string? Accomplishments { get; set; }
        public int? WastedHours { get; set; }
    }
}

View

Create

@model TallinnaRakenduslikKolledzKaur.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="HireDate"></label>
				<input asp-for="HireDate" class="form-control" />
				<span asp-validation-for="HireDate" 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="Comments"></label>
				<input asp-for="Comments" class="form-control" />
				<span asp-validation-for="Comments" class="text-danger"></span>
			</div>
			<div class="form-group">
				<label asp-for="BirthDate"></label>
				<input asp-for="BirthDate" class="form-control" />
				<span asp-validation-for="BirthDate" class="text-danger"></span>
			</div>
			<div class="form-group">
				<label asp-for="VacationDays"></label>
				<input asp-for="VacationDays" class="form-control" />
				<span asp-validation-for="VacationDays" class="text-danger"></span>
			</div>
			<div class="form-group">
				<div class="col-md-offset-2 col-md-10">
					<table>
						<tr>
							@{
								int count = 0;
								List<TallinnaRakenduslikKolledzKaur.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">Tühista Lisamine</a>
			</div>
		</form>
	</div>
</div>

Delete

@model TallinnaRakenduslikKolledzKaur.Models.Instructor

@{
	ViewData["Title"] = "Kustuta Õpetaja";
}

<h1>Kustuta Õpetaja</h1>
<h3>
	Kas oled kindel et tahad kustudada @Html.DisplayFor(Model => Model.FullName)
</h3>
<div>
	<h4>Õpetaja</h4>
	<hr />
	<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.HireDate)</dt>
	<dt class="col-sm-2">@Html.DisplayFor(Model => Model.HireDate)</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.VacationDays)</dt>
	<dt class="col-sm-2">@Html.DisplayFor(Model => Model.VacationDays)</dt>
	<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.Comments)</dt>
	<dt class="col-sm-2">@Html.DisplayFor(Model => Model.Comments)</dt>
	<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.BirthDate)</dt>
	<dt class="col-sm-2">@Html.DisplayFor(Model => Model.BirthDate)</dt>

	<form asp-action="Delete">
		<input type="hidden" asp-for="Id" />
		<input type="submit" value="Kustuta Õpetaja" class="btn btn-danger" /> | <a asp-action="Index">Tühista</a>
	</form>
</div>

Details

@model TallinnaRakenduslikKolledzKaur.Models.Instructor

@{
	ViewData["Title"] = "Viewing õpetaja";
}

<div>
	<h4>Õpetaja @Model.FullName</h4>
	<hr />
	<dl class="row">
		<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.FullName)</dt>
		<dd class="col-sm-10">@Html.DisplayFor(Model => Model.FullName)</dd>
	</dl>
	<dl class="row">
		<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.HireDate)</dt>
		<dd class="col-sm-10">@Html.DisplayFor(Model => Model.HireDate)</dd>
	</dl>
	<dl class="row">
		<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.CourseAssignments)</dt>
		<dd class="col-sm-10">@Html.DisplayFor(Model => Model.CourseAssignments)</dd>
	</dl>
	<dl class="row">
		<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.OfficeAssignment)</dt>
		<dd class="col-sm-10">@Html.DisplayFor(Model => Model.OfficeAssignment)</dd>
	</dl>
	<dl class="row">
		<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.VacationDays)</dt>
		<dd class="col-sm-10">@Html.DisplayFor(Model => Model.VacationDays)</dd>
	</dl>
	<dl class="row">
		<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.Comments)</dt>
		<dd class="col-sm-10">@Html.DisplayFor(Model => Model.Comments)</dd>
	</dl>
	<dl class="row">
		<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.BirthDate)</dt>
		<dd class="col-sm-10">@Html.DisplayFor(Model => Model.BirthDate)</dd>
	</dl>
	<td>
		<a asp-action="Edit" asp-route-id="@Model.Id">Muuda</a>
	</td>
</div>


<form asp-action="Tagasi">
	<input type="hidden" asp-for="Id" />
	<a asp-action="Index">Tagasi</a>
</form>

Edit

@model TallinnaRakenduslikKolledzKaur.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>

			<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="HireDate" class="control-label"></label>
				<input asp-for="HireDate" class="form-control" />
				<span asp-validation-for="HireDate" class="text-danger"></span>
			</div>
			<div class="form-group">
				<label asp-for="CourseAssignments" class="control-label"></label>
				<input asp-for="CourseAssignments" class="form-control" />
				<span asp-validation-for="CourseAssignments" class="text-danger"></span>
			</div>
			<div class="form-group">
				<label asp-for="OfficeAssignment" class="control-label"></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="VacationDays" class="control-label"></label>
				<input asp-for="VacationDays" class="form-control" />
				<span asp-validation-for="VacationDays" class="text-danger"></span>
			</div>
			<div class="form-group">
				<label asp-for="Comments" class="control-label"></label>
				<input asp-for="Comments" class="form-control" />
				<span asp-validation-for="Comments" class="text-danger"></span>
			</div>
			<div class="form-group">
				<label asp-for="BirthDate" class="control-label"></label>
				<input asp-for="BirthDate" class="form-control" />
				<span asp-validation-for="BirthDate" class="text-danger"></span>
			</div>
			<div class="form-group">
				<label asp-for="Status" class="control-label"></label>
				<input asp-for="Status" class="form-control" />
				<span asp-validation-for="Status" class="text-danger"></span>
			</div>
			<div class="form-group">
				<input type="submit" value="Edit" class="btn btn-primary" />
			</div>
		</form>
	</div>
</div>

<div>
	<a asp-action="Index">Mine tagasi loendisse</a>
</div>

Index

@model TallinnaRakenduslikKolledzKaur.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öölevõtukuupäev</th>
			<th>Kabinet</th>
			<th>Vacation Days</th>
			<th>Comments</th>
			<th>BirthDate</th>
			<th>Staatus</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.HireDate)</td>
				<td>
					@if (instructor.OfficeAssignment != null)
					{
						@instructor.OfficeAssignment.Location
					}
				</td>
				<td>@Html.DisplayFor(modelItem => instructor.VacationDays)</td>
				<td>
					@foreach (var course in instructor.CourseAssignments)
					{
						@course.Course.CourseId @: @course.Course.Title <br/>
					}
				</td>
				<td>@Html.DisplayFor(modelItem => instructor.BirthDate)</td>
				<td>@Html.DisplayFor(modelItem => instructor.Status)</td>
				<td>
					<a asp-action="Quickedit" asp-route-id="@instructor.Id">Kiirtegevus</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>

Quickedit

@model TallinnaRakenduslikKolledzKaur.Models.Instructor

@{
	ViewData["Title"] = "Muuda õpetaja";
}

<h1>Muuda õpetaja</h1>
<hr />
<div class="row">
	<div class="col-md-4">
		<form asp-action="Quickedit">		   

			<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="OfficeAssignment" class="control-label"></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="VacationDays" class="control-label"></label>
				<input asp-for="VacationDays" class="form-control" />
				<span asp-validation-for="VacationDays" class="text-danger"></span>
			</div>
			<div class="form-group">
				<label asp-for="Comments" class="control-label"></label>
				<input asp-for="Comments" class="form-control" />
				<span asp-validation-for="Comments" class="text-danger"></span>
			</div>
			<div class="form-group">
				<label asp-for="Status" class="control-label"></label>
				<input asp-for="Status" class="" />
				<span asp-validation-for="Status" class="text-danger"></span>
			</div>
			<div class="form-group">
				<input type="submit" value="Edit" class="btn btn-primary" />
			</div>
		</form>
	</div>
</div>

<div>
	<a asp-action="Index">Mine tagasi loendisse</a>
</div>