Õpetaja

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";
}
&lt;h2>Õpetajad&lt;/h2>
&lt;p>
	&lt;a asp-action="Create">Lisa Õpetaja&lt;/a>
&lt;/p>
&lt;table class="table">
	&lt;thead>
		&lt;tr>
			&lt;th>Perekonnanimi&lt;/th>
			&lt;th>Eesnimi&lt;/th>
			&lt;th>Töötevõtukuupäev&lt;/th>
			&lt;th>Kabinet&lt;/th>
			&lt;th>Palk&lt;/th>
			&lt;th>Ruumi number&lt;/th>
			&lt;th>E-mail&lt;/th>
			&lt;th>Tööriistad&lt;/th>
		&lt;/tr>
	&lt;/thead>
	&lt;tbody>
		@foreach (var instructor in Model.Instructors)
		{
			string selectedRow = "";
			if (instructor.ID ==(int?)ViewData["InstructorID"])
			{
				selectedRow = "table-success";
			}
			&lt;tr class=@selectedRow>
				&lt;td>@Html.DisplayFor(ModelItem => instructor.LastName)&lt;/td>
				&lt;td>@Html.DisplayFor(ModelItem => instructor.FirstName)&lt;/td>
				&lt;td>@Html.DisplayFor(ModelItem => instructor.HiredDate)&lt;/td>
				&lt;td>
					@if (instructor.OfficeAssignments != null)
					{
						@instructor.OfficeAssignments.Location
					}

				&lt;/td>

				&lt;td>@Html.DisplayFor(ModelItem => instructor.Salary)&lt;/td>
				&lt;td>@Html.DisplayFor(ModelItem => instructor.RoomID)&lt;/td>
				&lt;td>@Html.DisplayFor(ModelItem => instructor.Email)&lt;/td>
				
				&lt;td>
                    &lt;a asp-action="Delete" asp-route-id="@instructor.ID">Kustuta&lt;/a>
					&lt;a asp-action="Edit" asp-route-id="@instructor.ID">Edit&lt;/a>
					&lt;a asp-action="Details" asp-route-id="@instructor.ID">Details&lt;/a>

				&lt;/td>	
			&lt;/tr>
		}
	&lt;/tbody>
&lt;/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&lt;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;
        }