Departments controller, model, view

Mudel

using System.ComponentModel.DataAnnotations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion.Internal;
namespace TallinnaRakenduslikKolledz.Models
{
    public class Department
    {
        public enum DepartmentStatus
        {
            Suletud, Avatud, Pausil 
        }
        [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? StudentsCount {  get; set; }
        public string? DepartmentCategory { get; set; }
        public string? BestStudent {  get; set; }

        public DepartmentStatus? CurrentStatus { get; set; }
    }
}

See klass määrab ära, millised andmed ühe osakonna kohta andmebaasis salvestatakse ning seda kasutatakse Controllerites ja View’des, et andmeid lisada, muuta, kuvada ja kustutada.
Lisaks hoiab klass lisainfot nagu üliõpilaste arv, osakonna kategooria, parim üliõpilane ning osakonna hetkeseis, mis on määratud DepartmentStatus enumiga.

Controller

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.EntityFrameworkCore;
using TallinnaRakenduslikKolledz.Data;
using TallinnaRakenduslikKolledz.Models;

namespace TallinnaRakenduslikKolledz.Controllers
{
    public class DepartmentsController : Controller
    {
        private readonly SchoolContext _context;
        public DepartmentsController(SchoolContext context)
        {
            _context = context;
        }
        public async Task<IActionResult> Index()
        {
            var schoolContext = _context.Departments.Include(d => d.Administrator);
            return View(await schoolContext.ToListAsync());
        }

        // Create
        [HttpGet]
        public IActionResult Create()
        {
            ViewData["CreateAndEdit"] = "Create";
            return View();
        }

        [HttpPost, ValidateAntiForgeryToken]
        public async Task<IActionResult> Create([Bind("Name, Budget, StartDate, RowVersion, InstructorID, StudentsCount, DepartmentStatus")] Department department)
        {
            if (ModelState.IsValid)
            {
                _context.Add(department);
                await _context.SaveChangesAsync();
                return RedirectToAction("Index");
            }
            ViewData["InstructorID"] = new SelectList(_context.Instructors, "Id", "FullName", department.InstructorID);
            return View(department);
        }


        // Edit
        [HttpGet]
        public async Task<IActionResult> Edit(int? Id)
        {
            ViewData["CreateAndEdit"] = "Edit";
            var department = await _context.Departments.FirstOrDefaultAsync(m => m.DepartmentID == Id);
            if (Id == null)
            {
                return NotFound();
            }
            if (department == null)
            {
                return NotFound();
            }
            _context.Departments.Update(department);
            return View("Create", department);
        }
        [HttpPost, ValidateAntiForgeryToken, ActionName("Edit")]
        public async Task<IActionResult> EditConfirmed(int id, [Bind("Name, Budget, StartDate, StudentsCount, InstructorID")] Department department)
        {
            _context.Departments.Update(department);
            await _context.SaveChangesAsync();
            return RedirectToAction("Index");
        }

        // Delete
        [HttpGet]
        public async Task<IActionResult> Delete(int? id)
        {
            ViewData["DeleteAndDetails"] = "Delete";
            if (id == null)
            {
                return NotFound();
            }
            var department = await _context.Departments
                .Include(d => d.Administrator)
                .FirstOrDefaultAsync(d => d.DepartmentID == id);
            if (department == null)
            {
                return NotFound();
            }
            return View(department);
        }

        [HttpPost, ValidateAntiForgeryToken]
        public async Task<IActionResult> Delete(Department department)
        {
            if (await _context.Departments.AnyAsync(m => m.DepartmentID == department.DepartmentID))
            {
                _context.Departments.Remove(department);
                await _context.SaveChangesAsync();
            }
            return RedirectToAction("Index");
        }

        // Details
        public async Task<IActionResult> Details(int? id)
        {
            ViewData["DeleteAndDetails"] = "Details";
            if (id == null) 
            {
               return NotFound(); 
            }
            var department = await _context.Departments.FirstOrDefaultAsync(d => d.DepartmentID == id);
            return View(nameof(Delete), department);
        }
    }
}

DepartmentsController haldab osakondadega seotud tegevusi MVC arhitektuuris ning suhtleb andmebaasiga läbi SchoolContext

Index

Laeb kõik osakonnad koos vastutava õpetajaga.
Kasutab Include(d => d.Administrator), et tuua seotud õpetaja andmed, ja ToListAsync(), et saada kõik objektid

Create (GET)

Avab uue osakonna lisamise vaate.
ViewData abil antakse vaatele teada, et tegemist on Edit vaatega.

Create (POST)

Lisab uue osakonna andmebaasi.
Kontrollib ModelState.IsValid, salvestab andmed SaveChangesAsync() abil ja suunab tagasi Index vaatesse.

Edit (GET)

Leiab muudetava osakonna ID alusel.
Kasutab FirstOrDefaultAsync() ja avab sama vaate, mida kasutatakse ka loomisel.

Edit (POST)

Salvestab muudetud osakonna andmed andmebaasi ja suunab tagasi Index vaatesse.

Delete (GET)

Kuvab osakonna kustutamise kinnituse koos vastutava õpetaja andmetega.
Kasutab Include() ja FirstOrDefaultAsync().

Delete (POST)

Kontrollib, kas osakond on olemas AnyAsync() abil, kustutab selle ja salvestab muudatused.

Details

Kuvab ühe konkreetse osakonna detailinfo.
Leiab osakonna ID järgi FirstOrDefaultAsync() abil ja kasutab sama vaadet, mis Delete.

Vaated

Index

@model IEnumerable<TallinnaRakenduslikKolledz.Models.Department>
@{
	ViewData["Title"] = "Osakonnad";
}
<h1>Osakonnad</h1>
<p>
	<a asp-action="Create">Loo uus osakond</a>
</p>
<table class="table">
	<thead>
		<tr>
			<th>@Html.DisplayNameFor(model => model.Name)</th>
			<th>@Html.DisplayNameFor(model => model.Budget)</th>
			<th>@Html.DisplayNameFor(model => model.StartDate)</th>
			<th>@Html.DisplayNameFor(model => model.Administrator)</th>
			<th>@Html.DisplayNameFor(model => model.RowVersion)</th>
			<th>@Html.DisplayNameFor(model => model.StudentsCount)</th>
			<th>@Html.DisplayNameFor(model => model.CurrentStatus)</th>
			<th>Tööriistad</th>
		</tr>
	</thead>
	<tbody>
		@foreach(var department in Model)
		{
			<tr>
				<td>@Html.DisplayFor(modelItem => department.Name)</td>
				<td>@Html.DisplayFor(modelItem => department.Budget)</td>
				<td>@Html.DisplayFor(modelItem => department.StartDate)</td>
				<td>@Html.DisplayFor(modelItem => department.Administrator)</td>
				<td>@Html.DisplayFor(modelItem => department.RowVersion)</td>
				<td>@Html.DisplayFor(modelItem => department.StudentsCount)</td>
				<td>@Html.DisplayFor(modelItem => department.CurrentStatus)</td>
				<td>
					@* /* Muuda */ *@
					<a asp-action="Edit" asp-route-id="@department.DepartmentID" class="btn btn-dark">Muuda</a>
					@* /* Vaata */ *@
					<a asp-action="Details" asp-route-id="@department.DepartmentID" class="btn btn-dark">Vaata</a>
					@* /* Vaata Adminit */ *@

					@* /* Kustuta */ *@
					<a asp-action="Delete" asp-route-id="@department.DepartmentID" class="btn btn-dark">Eemalda</a>
				</td>
			</tr>
		}
	</tbody>
</table>

Create/Edit

@model TallinnaRakenduslikKolledz.Models.Department

@{
	ViewData["Title"] = "Osakonnad";
}
<div class="row">
	<div class="col-md-4">
@if (ViewBag.CreateAndEdit == "Create")
{
	<h2>Asuta uus osakond</h2>

	
			<form asp-action="Create">

				<input type="hidden" asp-for="RowVersion" value="@Html.Raw("0")" />

				<div asp-validation-summary="ModelOnly" class="text-danger"></div>

				<div class="form-group">
					<label asp-for="Name" class="control-label"></label>
					<input asp-for="Name" class="control-label" />
					<span asp-validation-for="Name" class="text-danger"></span>
				</div>

				<div class="form-group">
					<label asp-for="Budget" class="control-label"></label>
					<input asp-for="Budget" class="control-label" />
					<span asp-validation-for="Budget" class="text-danger"></span>
				</div>

				<div class="form-group">
					<label asp-for="StartDate" class="control-label"></label>
					<input asp-for="StartDate" class="control-label" />
					<span asp-validation-for="StartDate" class="text-danger"></span>
				</div>

				<div class="form-group">
					<label asp-for="StudentsCount" class="control-label"></label>
					<input asp-for="StudentsCount" class="control-label" />
					<span asp-validation-for="StudentsCount" class="text-danger"></span>
				</div>

				<div class="form-group">
					<label asp-for="InstructorID" class="control-label"></label>
					<select asp-for="InstructorID" class="control-label" asp-items="ViewBag.InstructorID">
						<option value="">-- Palun Vali õpetaja</option>
					</select>>
					<span asp-validation-for="InstructorID" class="text-danger"></span>
				</div>

				<div class="form-group">
					<input type="submit" value="Create" class="btn btn-primary" /> | <a asp-action="Index" class="btn btn-outline-primary">Mine tagasi loendisse</a>
				</div>
			</form>
}
@if (ViewBag.CreateAndEdit == "Edit")
{
			<form asp-action="Edit">
				<input type="hidden" asp-for="DepartmentID" />

				<input type="hidden" asp-for="RowVersion" value="@Html.Raw("0")" />

				<div asp-validation-summary="ModelOnly" class="text-danger"></div>

				<div class="form-group">
					<label asp-for="Name" class="control-label"></label>
					<input asp-for="Name" class="form-control" />
					<span asp-validation-for="Name" class="text-danger"></span>
				</div>

				<div class="form-group">
					<label asp-for="Budget" class="control-label"></label>
					<input asp-for="Budget" class="form-control" />
					<span asp-validation-for="Budget" class="text-danger"></span>
				</div>
				<div class="form-group">
					<label asp-for="StartDate" class="control-label"></label>
					<input asp-for="StartDate" class="form-control" />
					<span asp-validation-for="StartDate" class="text-danger"></span>
				</div>
				<div class="form-group">
					<label asp-for="StudentsCount" class="control-label"></label>
					<input asp-for="StudentsCount" class="form-control" />
					<span asp-validation-for="StudentsCount" class="text-danger"></span>
				</div>
				<div class="form-group">
					<label asp-for="InstructorID" class="control-label"></label>
					<input asp-for="InstructorID" class="form-control" />
					<span asp-validation-for="InstructorID" class="text-danger"></span>
				</div>

				<div class="form-group">
					<input type="submit" value="Muuda" class="btn btn-primary" /> | <a asp-action="Index" class="btn btn-outline-primary">Mine tagasi loendisse </a>
				</div>
			</form>
}

Delete/Details

@model TallinnaRakenduslikKolledz.Models.Department
@{
	ViewData["Title"] = "Vaata rohkem";
}
<!-- Details -->
@if (ViewBag.DeleteAndDetails == "Details")
{
	<p>
		<h3>Osakonna andmed</h3>
	</p>
}
<!-- Delete -->
@if (ViewBag.DeleteAndDetails == "Delete")
{
	<p>
		<h3>Kustuta osakond</h3>
	</p>
}

<h2>@Html.DisplayFor(modelItem => Model.Name)</h2>
<div>
	<dl class="row">
		<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.Name)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(Model => Model.Name)</dt>
		<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.DepartmentID)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(Model => Model.DepartmentID)</dt>
		<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.Budget)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(Model => Model.Budget)</dt>
		<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.StudentsCount)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(Model => Model.StudentsCount)</dt>
		<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.CurrentStatus)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(Model => Model.CurrentStatus)</dt>
		<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.InstructorID)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(Model => Model.InstructorID)</dt>
		<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.Administrator)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(Model => Model.Administrator)</dt>
		<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.StartDate)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(Model => Model.StartDate)</dt>
	</dl>
	@if (ViewBag.DeleteAndDetails == "Delete")
	{
		<form asp-action="Delete">
			<input type="hidden" asp-for="DepartmentID" />
			<input type="hidden" asp-for="RowVersion" />
			<input type="submit" value="Kustuta" class="btn btn-danger" /> | <a asp-action="Index">Tühista</a>
		</form>
	}
</div>