Student controller, model, view

Mudel

using System.ComponentModel.DataAnnotations;

namespace TallinnaRakenduslikKolledz.Models
{
    public class Student
    {
        [Key]
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public DateTime? EnrollmentDate { get; set; }
        public ICollection<Enrollment>? Enrollments { get; set; }
        
        public DateTime? BirthDate { get; set; }

        public string? email { get; set; }

        public int? Age { get; set; }
        public string? Gender { get; set; }
        public string? Group { get; set; }
    }
}

See klass määrab ära, millised andmed ühe õpilase kohta andmebaasis salvestatakse ning seda kasutatakse Controllerites ja View’des, et andmeid lisada, muuta, kuvada ja kustutada.

Controller

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

namespace TallinnaRakenduslikKolledz.Controllers
{
    public class StudentsController : Controller
    {
        private readonly SchoolContext _context;
        public StudentsController(SchoolContext context) 
        { 
            _context = context;
        }
        public async Task<IActionResult> Index()
        {
            return View(await _context.Students.ToListAsync());
        }
        [HttpGet]
        public IActionResult Create()
        {
            return View();
        }
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create([Bind
            ("Id, FirstName, LastName, Gender, EnrollmentDate, Age, email")] Student student)
        {
            if (ModelState.IsValid)
            {
                _context.Students.Add(student);
                await _context.SaveChangesAsync();
                return RedirectToAction("Index");
                // return RedirectToAction(nameof(Index))
            }
            return View(student);
        }
        //Delete
        [HttpGet]
        public async Task<IActionResult> Delete(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }
            var student = await _context.Students.FirstOrDefaultAsync(m => m.Id == id);
            
            if (student == null)
            {
                return NotFound();
            }
            return View(student);
        }
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> DeleteConfirmed(int id)
        {
            var student = await _context.Students.FindAsync(id);
            _context.Students.Remove(student);
            await _context.SaveChangesAsync();
            return RedirectToAction("Index");
        }
        //Edit
        [HttpGet]
        public async Task<IActionResult> Edit(int? Id)
        {
            var student = await _context.Students.FirstOrDefaultAsync(m => m.Id == Id);
            if (Id == null)
            {
                return NotFound();
            }
            if (student == null)
            {
                return NotFound();
            }
            _context.Students.Update(student);
            return View(student);
        }
        [HttpPost, ValidateAntiForgeryToken, ActionName("Edit")]
        public async Task<IActionResult> EditConfirmed(int id, [Bind("Id, LastName, FirstName")] Student student)
        {
            _context.Students.Update(student);
            await _context.SaveChangesAsync();
            return RedirectToAction("Index");
        }

        //Details
        [HttpGet]
        public async Task<IActionResult> Details(int? id)
        {
            var student = await _context.Students.FirstOrDefaultAsync(m => m.Id == id);
            return View(student);
        }
    }
}

StudentsController vastutab õpilastega seotud tegevuste eest.
See kontrollib kasutaja päringuid, suhtleb andmebaasiga läbi SchoolContext ning suunab kasutaja vastavatesse vaadetesse.

Index

Index kuvab kõik andmebaasis olevad õpilased.

  1. Kasutab _context.Students.ToListAsync()
  2. ToListAsync() on LINQ meetod, mis toob kõik kirjed andmebaasist asünkroonselt
  3. Andmed saadetakse Index vaatesse tabelina kuvamiseks

Create (GET)

Avab vaate, kus kasutaja saab sisestada uue õpilase andmed.

Create (POST)

Salvestab uue õpilase andmebaasi.

  1. Kasutab [Bind], et määrata, millised väljad on lubatud
  2. Kontrollib ModelState.IsValid, et andmed oleksid korrektselt sisestatud.
  3. Lisab uue õpilase _context.Students.Add(student)
  4. Salvestab muudatused SaveChangesAsync() abil
  5. Suunab kasutaja tagasi Index vaatesse

Delete (GET)

Kuvab kustutamise kinnituse vaate.

  1. Kontrollib, kas id on olemas
  2. Kasutab FirstOrDefaultAsync(m => m.Id == id), lambda avaldis, selleks, et lühidalt leidma esimese sobiva õpilase id järgi.
  3. Kui õpilast pole võimalik leidma, tagastatakse NotFound()

DeleteConfirmed (POST)

Kustutab õpilase lõplikult andmebaasist.

  1. Kasutab FindAsync(id), et leida objekt primaarvõtme järgi
  2. Eemaldab objekti Remove() abil
  3. Salvestab muudatused SaveChangesAsync() abil
  4. Suunab tagasi Index vaatesse

Edit (GET)

Avab vaate, kus saab õpilase andmeid muuta.

  1. Kasutab FirstOrDefaultAsync(m => m.Id == Id)
  2. Kontrollib, kas ID ja objekt on olemas
  3. Saadab leitud õpilase Edit vaatesse

EditConfirmed (POST)

Salvestab muudetud õpilase andmed.

  1. Kasutab [Bind], et määrata, millised väljad on lubatud
  2. Uuendab andmed _context.Students.Update(student)
  3. Salvestab muudatused SaveChangesAsync() abil
  4. Suunab kasutaja Index vaatesse

Details

Kuvab ühe konkreetse õpilase detailse info.

  1. Leiab õpilase FirstOrDefaultAsync(m => m.Id == id) abil
  2. Saadab andmed Details vaatesse kuvamiseks

Vaated

Index

@model IEnumerable<TallinnaRakenduslikKolledz.Models.Student>
@{
	ViewData["Title"] = "Õpilased";
}
<h1>Õpilaste Loend</h1>
<p>
	<a asp-action="Create">Sisesta Õpilane</a>
</p>
<table class ="table">
	<thead>
		<tr>
			<th>
				@Html.DisplayNameFor(Model => Model.LastName)
			</th>
			<th>
				@Html.DisplayNameFor(Model => Model.FirstName)
			</th>
			<th>
				@Html.DisplayNameFor(Model => Model.EnrollmentDate)
			</th>
			<th>
				@Html.DisplayNameFor(Model => Model.Age)
			</th>
			<th>
				Tööriistad
			</th>
		</tr>
	</thead>
	<tbody>
		@foreach (var student in Model)
		{
			<tr>
				<td>
					@Html.DisplayFor(modelItem => student.LastName)
				</td>
				<td>
					@Html.DisplayFor(modelItem => student.FirstName)
				</td>
				<td>
					@Html.DisplayFor(modelItem => student.EnrollmentDate)
				</td>
				<td>
					@Html.DisplayFor(modelItem => student.Age)
				</td>
				<td>
					<a asp-action="Edit" asp-route-id="@student.Id">Muuda</a>
					<a asp-action="Details" asp-route-id="@student.Id">Vaata</a>
					<a asp-action="Delete" asp-route-id="@student.Id">Kustuta</a>
				</td>
			</tr>
		}
	</tbody>
</table>


Edit

@model IEnumerable<TallinnaRakenduslikKolledz.Models.Student>
@{
	ViewData["Title"] = "Õpilased";
}
<h1>Õpilaste Loend</h1>
<p>
	<a asp-action="Create">Sisesta Õpilane</a>
</p>
<table class ="table">
	<thead>
		<tr>
			<th>
				@Html.DisplayNameFor(Model => Model.LastName)
			</th>
			<th>
				@Html.DisplayNameFor(Model => Model.FirstName)
			</th>
			<th>
				@Html.DisplayNameFor(Model => Model.EnrollmentDate)
			</th>
			<th>
				@Html.DisplayNameFor(Model => Model.Age)
			</th>
			<th>
				Tööriistad
			</th>
		</tr>
	</thead>
	<tbody>
		@foreach (var student in Model)
		{
			<tr>
				<td>
					@Html.DisplayFor(modelItem => student.LastName)
				</td>
				<td>
					@Html.DisplayFor(modelItem => student.FirstName)
				</td>
				<td>
					@Html.DisplayFor(modelItem => student.EnrollmentDate)
				</td>
				<td>
					@Html.DisplayFor(modelItem => student.Age)
				</td>
				<td>
					<a asp-action="Edit" asp-route-id="@student.Id">Muuda</a>
					<a asp-action="Details" asp-route-id="@student.Id">Vaata</a>
					<a asp-action="Delete" asp-route-id="@student.Id">Kustuta</a>
				</td>
			</tr>
		}
	</tbody>
</table>


Details

@model TallinnaRakenduslikKolledz.Models.Student

@{
	ViewData["Title"] = "Vaata õpilase andmeid";
}

<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.EnrollmentDate)</dt>
		<dd class="col-sm-10">@Html.DisplayFor(Model => Model.EnrollmentDate)</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 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>
<div>
	<a asp-action="Index">Mine tagasi loendisse</a>
</div>

Delete

@model TallinnaRakenduslikKolledz.Models.Student

@{
	ViewData["Title"] = "Kustuta õpilane";
}

<h1>Kustuta õpilane</h1>
<h3>
	Kas oled kindel, et tahad õpilast @Model.FirstName @Model.LastName eemaldada?
</h3>
<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.EnrollmentDate)</dt>
		<dd class="col-sm-10">@Html.DisplayFor(model => model.EnrollmentDate)</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>

	@if (Model.Enrollments != null)
	{
		foreach (var courseEnrollment in Model.Enrollments)
		{
			<dl class="row">
				<dd class="col-sm-10">@(courseEnrollment)</dd>
			</dl>
		}
	}

	@if (Model.Gender != null)
	{
		@Model.Gender;
	}

	@if (Model.Group != null)
	{
		@Model.Group;
	}

</div>

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

Create

@model TallinnaRakenduslikKolledz.Models.Student

@{
	ViewData["Title"] = "Loo uus õpilane";
}

<h1>Loo uus õpilane</h1>
<hr/>

<div class="row">
	<div class="col-md-4">
		<form asp-action="Create">

			<div asp-validation-summary="ModelOnly" class="text-danger"></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="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="Gender" class="control-label"></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="EnrollmentDate" class="control-label"></label>
				<input asp-for="EnrollmentDate" class="form-control" />
				<span asp-validation-for="EnrollmentDate" class="text-danger"></span>
			</div>

			<div class="form-group">
				<label asp-for="Age" class="control-label"></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="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>