Osakonnad

Department model: Andmed

using System.ComponentModel.DataAnnotations;

namespace TallinnaRakenduslikKolledz.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? Quota { get; set; }
        public string? LeaderName {  get; set; }
        public string? Pet {  get; set; }
    }
}

Department View kasutas on 3 vaadet: Index, Create, Delete.

Department Index on pea vaade kui lähed “Osakonnad” lehele

@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.Quota)</th>
			<th>@Html.DisplayNameFor(model => model.LeaderName)</th>
			<th>@Html.DisplayNameFor(model => model.Pet)</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.Quota)</td>
					<td>@Html.DisplayFor(modelItem => department.LeaderName)</td>
					<td>@Html.DisplayFor(modelItem => department.Pet)</td>
					<td>
					@*/* Muuda */*@

					@*/* Vaata */*@

					@*/* Vaata Adminit */*@

					@*/* Kustuta */*@
					<a asp-action="Edit" asp-route-id="@department.DepartmentID">Muuda</a>
					<a asp-action="Details" asp-route-id="@department.DepartmentID">Vaata</a>
					<a asp-action="Delete" asp-route-id="@department.DepartmentID">Eemalda</a>
					</td>
			</tr>
		}
	</tbody>
</table>

Department Create vaade on samas razor view’s kus on edit vaate mis laseb Osakonde lisada Indexi ja muuta nende andmeid.

@model TallinnaRakenduslikKolledz.Models.Department
@{
	ViewData["Title"] = "Osakond";
}
@if (ViewBag.action == "Create")
{
    <p><h3>Loo osakond:</h3></p>
    <hr />
    <div class="row">
        <div class="col-md-8">
            <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="InstructorID" class="control-label"></label>
				<input asp-for="InstructorID" class="control-label" />
				<span asp-validation-for="InstructorID" class="text-danger"></span>
			</div>
			<div class="form-group">
				<label asp-for="Administrator" class="control-label"></label>
				<input asp-for="Administrator" class="control-label" />
				<span asp-validation-for="Administrator" class="text-danger"></span>
			</div>

			<div class="form-group">
				<label asp-for="Quota" class="control-label"></label>
				<input asp-for="Quota" class="control-label" />
				<span asp-validation-for="Quota" class="text-danger"></span>
			</div>
			<div class="form-group">
				<label asp-for="LeaderName" class="control-label"></label>
				<input asp-for="LeaderName" class="control-label" />
				<span asp-validation-for="LeaderName" class="text-danger"></span>
			</div>
			<div class="form-group">
				<label asp-for="Pet" class="control-label"></label>
				<input asp-for="Pet" class="control-label" />
				<span asp-validation-for="Pet" class="text-danger"></span>
			</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>
}
else if (ViewBag.action == "Edit")
{
	<p>
		<h3>Muuda osakonda</h3>
	</p>
	<hr />
	<div class="row">
		<div class="col-md-8">
			<form asp-action="EditConfirmed">

				<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="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="InstructorID" class="control-label"></label>
					<input asp-for="InstructorID" class="control-label" />
					<span asp-validation-for="InstructorID" class="text-danger"></span>
				</div>
				<div class="form-group">
					<label asp-for="Administrator" class="control-label"></label>
					<input asp-for="Administrator" class="control-label" />
					<span asp-validation-for="Administrator" class="text-danger"></span>
				</div>

				<div class="form-group">
					<label asp-for="Quota" class="control-label"></label>
					<input asp-for="Quota" class="control-label" />
					<span asp-validation-for="Quota" class="text-danger"></span>
				</div>
				<div class="form-group">
					<label asp-for="LeaderName" class="control-label"></label>
					<input asp-for="LeaderName" class="control-label" />
					<span asp-validation-for="LeaderName" class="text-danger"></span>
				</div>
				<div class="form-group">
					<label asp-for="Pet" class="control-label"></label>
					<input asp-for="Pet" class="control-label" />
					<span asp-validation-for="Pet" 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>

Department Delete on koos edit vaadeka mis laseb Osakondasid kustutada ja nende detailse vaatada kasutades ühte ja sama vaate razor view

@model TallinnaRakenduslikKolledz.Models.Department


@{
    ViewData["Title"] = ViewBag.action == "Delete" ? "Kustuta Osakond" : "Osakonna detailid";
}

<h2>@Html.DisplayFor(modelItem => Model.Name)</h2>

@if (ViewBag.action == "Delete")
{
    <p>
        <h3>Kustuta osakond:</h3>
    </p>
}
else if (ViewBag.action == "Details")
{
    <p>
        <h3>Osakonna detailid</h3>
    </p>
}
<div>
    <hr />
        <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>
        </dl>
        <dl>
        <dt class="col-sm-2">@Html.DisplayNameFor(model => model.Budget)</dt>
        <dt class="col-sm-2">@Html.DisplayFor(model => model.Budget)</dt>
        </dl>
        <dl>
        <dt class="col-sm-2">@Html.DisplayNameFor(model => model.StartDate)</dt>
        <dt class="col-sm-2">@Html.DisplayFor(model => model.StartDate)</dt>
        </dl>
        <dl>
        <dt class="col-sm-2">@Html.DisplayNameFor(model => model.Administrator)</dt>
        <dt class="col-sm-2">@Html.DisplayFor(model => model.Administrator)</dt>
        </dl>
        <dl>
        <dt class="col-sm-2">@Html.DisplayNameFor(model => model.RowVersion)</dt>
        <dt class="col-sm-2">@Html.DisplayFor(model => model.RowVersion)</dt>
        </dl>
        <dl>
        <dt class="col-sm-2">@Html.DisplayNameFor(model => model.Quota)</dt>
        <dt class="col-sm-2">@Html.DisplayFor(model => model.Quota)</dt>
        </dl>
        <dt class="col-sm-2">@Html.DisplayNameFor(model => model.LeaderName)</dt>
        <dt class="col-sm-2">@Html.DisplayFor(model => model.LeaderName)</dt>
        </dl>
        <dl>
        <dt class="col-sm-2">@Html.DisplayNameFor(model => model.Pet)</dt>
        <dt class="col-sm-2">@Html.DisplayFor(model => model.Pet)</dt>
        </dl>
    @if(ViewBag.action == "Delete")
    {
         <form asp-action="Delete" method="post">
            @Html.AntiForgeryToken()
            <input type="hidden" asp-for="DepartmentID" />
            <button type="submit" class="btn btn-danger">Delete</button>
            <a asp-action="Index" class="btn btn-secondary">Cancel</a>
         </form>
    }
    else if (ViewBag.action == "Details")
    {
        <a asp-action="Index">Mine tagasi</a>
    }
</div>

@*<dl class="row">
		<dt class="col-sm-2">@Html.DisplayNameFor(model => model.ID)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(model => model.ID)</dt>
	</dl>
	<dl class="row">
		<dt class="col-sm-2">@Html.DisplayNameFor(model => model.Title)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(model => model.Title)</dt>
	</dl>
	<dl class="row">
		<dt class="col-sm-2">@Html.DisplayNameFor(model => model.Credits)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(model => model.Credits)</dt>
	</dl>
	<dl class="row">
		<dt class="col-sm-2">@Html.DisplayNameFor(model => model.DepartmentID)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(model => model.DepartmentID)</dt>
	</dl>
	<dl class="row">
		<dt class="col-sm-2">@Html.DisplayNameFor(model => model.Enrollments)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(model => model.Enrollments)</dt>
	</dl>
	<dl class="row">
		<dt class="col-sm-2">@Html.DisplayNameFor(model => model.CourseAssignments)</dt>
		<dt class="col-sm-2">@Html.DisplayFor(model => model.CourseAssignments)</dt>
	</dl>*@

Controllers:

Seda kasutatakse, et kuvada osakondade nimekirja, lisada uusi osakonde, muuta olemasolevaid osakonde, näitada osakonna detaile ja kustutada osakonde

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

namespace TallinnaRakenduslikKolllež.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());
        }
        [HttpGet]
        public async Task<IActionResult> Create()
        {
            ViewData["action"] = "Create";
            return View();
        }
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create([Bind("Name,Budget,StartDate,RowVersion,Administrator,Quota,LeaderName,Pet")] Department departments)
        {
            ViewData["action"] = "Create";
            if (ModelState.IsValid)
            {
                _context.Departments.Add(departments);
                await _context.SaveChangesAsync();
                return RedirectToAction("Index");
                // return RedirectToAction(nameof(Index))
            }
            return View(departments);
        }
        [HttpGet]
        public async Task<IActionResult> Edit(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }
            var department = await _context.Departments.FirstOrDefaultAsync(x => x.DepartmentID == id);
            if (department == null)
            {
                return NotFound();
            }
            ViewData["action"] = "Edit";
            return View("Create", department);
        }
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> EditConfirmed(int id, [Bind("DepartmentID,Name,Budget,StartDate,RowVersion,Administrator,Quota,LeaderName,Pet")] Department department)
        {
            //ViewBag.Edit = Edit(id);
            
            //if (id != department.DepartmentID)
            //{
            //    return NotFound();
            //}
            if (ModelState.IsValid)
            {
                _context.Departments.Update(department);
                await _context.SaveChangesAsync();
                return RedirectToAction("Index");
                // return RedirectToAction(nameof(Index))
            }
            return View(department);
        }
        [HttpGet]
        public async Task<IActionResult> Delete(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }
            var department = await _context.Departments.FirstOrDefaultAsync(m => m.DepartmentID == id);
            if (department == null)
            {
                return NotFound();
            }
            ViewBag.action = "Delete";
            return View("Delete", department);
        }

        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> DeleteConfirmed(int id)
        {
            var department = await _context.Departments.FindAsync(id);
            if (department == null)
            {
                return NotFound();
            }
            _context.Departments.Remove(department);
            await _context.SaveChangesAsync();
            return RedirectToAction("Index");
        }
        
        [HttpGet]
        public async Task<IActionResult> Details(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }
            var department = await _context.Departments.FirstOrDefaultAsync(m => m.DepartmentID == id);
            if (department == null)
            {
                return NotFound();
            }
            ViewBag.action = "Details";
            return View("Delete", department);
        }
    }
}

Andmebaasi kontekst

        private readonly SchoolContext _context;

        public DepartmentsController(SchoolContext context)
        {
            _context = context;
        }

SchoolContext on Entity Frameworki DbContext

Dependency Injectioni tehakse sellele autamaatselt

_context.Departments tähendab departmenti tabeli

Index

        public async Task<IActionResult> Index()
        {
            var schoolContext = _context.Departments.Include(d => d.Administrator);
            return View(await schoolContext.ToListAsync());
        }

Näitab kõiki osakonde nimekirjas koos administaatorite andmedega vaatesse

Create Get

        [HttpGet]
        public async Task<IActionResult> Create()
        {
            ViewData["action"] = "Create";
            return View();
        }

Kuvab uue osakonna tegemis vormi

Create Post

        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create([Bind("Name,Budget,StartDate,RowVersion,Administrator,Quota,LeaderName,Pet")] Department departments)
        {
            ViewData["action"] = "Create";
            if (ModelState.IsValid)
            {
                _context.Departments.Add(departments);
                await _context.SaveChangesAsync();
                return RedirectToAction("Index");
                // return RedirectToAction(nameof(Index))
            }
            return View(departments);
        }

salvestab osakonna andmebaasi kui vormi andmed on õiged:

Edit Get

        [HttpGet]
        public async Task<IActionResult> Edit(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }
            var department = await _context.Departments.FirstOrDefaultAsync(x => x.DepartmentID == id);
            if (department == null)
            {
                return NotFound();
            }
            ViewData["action"] = "Edit";
            return View("Create", department);
        }

kuvab osakonna muutmise vormi (kasutab sama vaadet nagu create)

Edit Post

        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> EditConfirmed(int id, [Bind("DepartmentID,Name,Budget,StartDate,RowVersion,Administrator,Quota,LeaderName,Pet")] Department department)
        {
            //ViewBag.Edit = Edit(id);
            
            //if (id != department.DepartmentID)
            //{
            //    return NotFound();
            //}
            if (ModelState.IsValid)
            {
                _context.Departments.Update(department);
                await _context.SaveChangesAsync();
                return RedirectToAction("Index");
                // return RedirectToAction(nameof(Index))
            }
            return View(department);
        }

salvestab muudatused andmebaasi

Details Get

        [HttpGet]
        public async Task<IActionResult> Details(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }
            var department = await _context.Departments.FirstOrDefaultAsync(m => m.DepartmentID == id);
            if (department == null)
            {
                return NotFound();
            }
            ViewBag.action = "Details";
            return View("Delete", department);
        }

kuvab ühe osakonna andmeid (kasutab sama vaadet nagu delete)

Delete Get

        [HttpGet]
        public async Task<IActionResult> Delete(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }
            var department = await _context.Departments.FirstOrDefaultAsync(m => m.DepartmentID == id);
            if (department == null)
            {
                return NotFound();
            }
            ViewBag.action = "Delete";
            return View("Delete", department);
        }

Kuvab kusutamise vaate 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 osakonna id järgi ja eemaldatakse andmebaasist siis salvetatakse muudatused ja suunatakse tagasi osakonna nimekirja