Kursused

Course model: Andmed

using System.ComponentModel.DataAnnotations;

namespace TallinnaRakenduslikKolledz.Models
{
    public class Course
    {
        [Key]
        public int ID { get; set; }
        public string Title { get; set; }
        public int Credits  { get; set; }
        public Department? Department { get; set; }
        public int? DepartmentID { get; set; }
        public ICollection<Enrollment>? Enrollments { get; set; }
        public ICollection<CourseAssignment>? CourseAssignments { get; set; }
    }
}

Course View kaustas on 3 vaadet: Index, Create, Delete.

Course Index on pea vaade kui lähed “Kursused” lehele

@model IEnumerable<TallinnaRakenduslikKolledz.Models.Course>

@{
	ViewData["Title"] = "Kursused/Õppeained";
}

<h2>Kursused</h2>
<p>
	<a asp-action="Create">Tee uus Kursus</a>
</p>

<table class="table">

	<thead>
		<tr>
			@*<th> @Html.DisplayNameFor(model => model.ID)</th>*@
			<th> @Html.DisplayNameFor(model => model.Title)</th>
			<th> @Html.DisplayNameFor(model => model.Credits)</th>
			<th> @Html.DisplayNameFor(model => model.Department.Name)</th>
			@*	<th> @Html.DisplayNameFor(model => model.Department.Administrator.FullName)</th>*@
			<th>Tööriistad</th>
		</tr>
	</thead>

	<tbody>
		@foreach (var course in Model)
		{
			<tr>
			@*<th>
				@Html.DisplayFor(modelItem => course.ID)
			</th>*@
			<th>
				@Html.DisplayFor(modelItem => course.Title)
			</th>
			<th>
				@Html.DisplayFor(modelItem => course.Credits)
			</th>
			<th>
				@Html.DisplayFor(modelItem => course.Department.Name)
			</th>
@*			<tr>
				@Html.DisplayFor(modelItem => course.Department.Administrator.FullName)
			</tr>*@
			<th>
					<a asp-action="Edit" asp-route-id="@course.ID">Muuda</a>
					<a asp-action="Details" asp-route-id="@course.ID">Vaata</a>
					<a asp-action="Delete" asp-route-id="@course.ID">Kustuta</a>
			</th>
			</tr>
		}
	</tbody>
</table>

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

@model TallinnaRakenduslikKolledz.Models.Course
@{
	ViewData["Title"] = "Uus kursus";
}
@if (ViewBag.action == "Create")
{
	<h1>Tee uus kursus</h1>
	<h4>Sisesta info:</h4>
	<hr />
	<div class="row">
		<div class="col-md-4">
			<form asp-action="Create">
				<div asp-validation-summary="ModelOnly" class="text-danger"></div>
			@*<div>
				<label asp-for="ID" class="control-label"></label>
				<input asp-for="ID" class="form-control"/>
				<span asp-validation-for="ID" class="text-danger"></span>
			</div>*@
				<div>
					<label asp-for="Title" class="control-label"></label>
						<input asp-for="Title" class="form-control"/>
					<span asp-validation-for="Title" class="text-danger"></span>
				</div>
				<div>
					<label asp-for="Credits" class="control-label"></label>
						<input asp-for="Credits" class="form-control"/>
					<span asp-validation-for="Credits" class="text-danger"></span>
				</div>
				<div>
					<label asp-for="Department" class="control-label"></label>
					<select asp-for="DepartmentID" class="form-control" asp-items="ViewBag.DepartmentID">
						<option value="" class="form-control">-- Vali osakond--</option>
					</select>
					<span asp-validation-for="DepartmentID" class="text-danger"></span>
				</div>
				<div class=" form-group">
					<input type="submit" value="Tee uus" class="btn btn-primary" /> | <a asp-action="Index" class="btn btn-outline-primary">Tühista</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="ID" />
				<div asp-validation-summary="ModelOnly" class="text-danger"></div>
				@*			<div>
				<label asp-for="ID" class="control-label"></label>
				<input asp-for="ID" class="form-control"></input>
				<span asp-validation-for="ID" class="text-danger"></span>
			</div>@**@
				<div class="form-group">
					<label asp-for="Title" class="control-label"></label>
					<input asp-for="Title" class="control-label" />
					<span asp-validation-for="Title" class="text-danger"></span>
				</div>
				<div class="form-group">
					<label asp-for="Credits" class="control-label"></label>
					<input asp-for="Credits" class="control-label" />
					<span asp-validation-for="Credits" class="text-danger"></span>
				</div>
				<div>
					<label asp-for="Department" class="control-label"></label>
					<select asp-for="DepartmentID" class="form-control" asp-items="ViewBag.DepartmentID">
						<option value="" class="form-control">-- Vali osakond--</option>
					</select>
					<span asp-validation-for="DepartmentID" class="text-danger"></span>
				</div>
				<div class="form-group">
					<input type="submit" value="Sisesta" class="btn btn-primary" />
				</div>
			</form>
		</div>
	</div>
}

Course Delete on koos edit vaadeka mis laseb kursuseid kustutada ja nende detaile vaatada kasutades ühte ja sama razor view

@model TallinnaRakenduslikKolledz.Models.Course
@{
	ViewData["Title"] = "Kustuta kursus";
}
@if (ViewBag.action == "Delete")
{
	<h1>Kustata @Html.DisplayFor(Model => Model.Title)</h1>
	<h3>Oled kindel?</h3>
	<div>
		<h4>Kursus</h4>
		<hr />
		<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>

		<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>
}
else if(ViewBag.action == "Details")
{
	<h1>Andmed</h1>
	<div>
		<h4>Kursus</h4>
		<hr />
		<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>

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

Controllers:

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

namespace TallinnaRakenduslikKolllež.Controllers
{
    public class CoursesController : Controller
    {
        private readonly SchoolContext _context;

        public CoursesController(SchoolContext context)
        {
            _context = context;
        }
        public IActionResult Index()
        {
            var courses = _context.Courses.Include(c => c.Department)
                .AsNoTracking();
            Console.WriteLine(courses);
            return View(courses);
        }
        [HttpGet]
        public IActionResult Create()
        {
            ViewData["action"] = "Create";
            PopulateDepartmentsDropDownList();
            return View();
        }
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create([Bind("Title,Credits,Department,DepartmentID,Enrollments,CourseAssignments")]Course courses)
        {
            ViewData["action"] = "Create";
            if (ModelState.IsValid)
            {
                 _context.Courses.Add(courses);
                await _context.SaveChangesAsync();
                return RedirectToAction("Index");
                //PopulateDepartmentsDropDownList(course.DepartmentID);
            }
            PopulateDepartmentsDropDownList();
            return View(courses);

        }
        [HttpGet]
        public async Task<IActionResult> Edit(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }
            var courses = await _context.Courses.FirstOrDefaultAsync(r => r.ID == id);
            if (courses == null)
            {
                return NotFound();
            }
            ViewData["action"] = "Edit";
            return View("Create", courses);
        }
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> EditConfirmed(int id, [Bind("ID,Title,Credits,Department,DepartmentID,Enrollments,CourseAssignments")] Course courses)
        {
            if (ModelState.IsValid)
            {
                _context.Courses.Update(courses);
                await _context.SaveChangesAsync();
                return RedirectToAction("Index");
            }
            return View(courses);
        }
        [HttpGet]
        public async Task<IActionResult> Delete(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }
            var courses = await _context.Courses.FirstOrDefaultAsync(m => m.ID == id);
            if (courses == null)
            {
                return NotFound();
            }
            ViewBag.action = "Delete";
            return View("Delete", courses);
        }
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> DeleteConfirmed (int id)
        {
            var courses = await _context.Courses.FindAsync(id);
            if (courses == null)
            {
                return NotFound();
            }
            _context.Courses.Remove(courses);
            await _context.SaveChangesAsync();
            return RedirectToAction("Index");
        }
        private void PopulateDepartmentsDropDownList(object selectedDepartment = null)
        {
            var departmentsQuery = from d in _context.Departments
                                   orderby d.Name
                                   select d;
            ViewBag.DepartmentID = new SelectList(departmentsQuery.AsNoTracking(), "DepartmentID", "Name", selectedDepartment);
        }
        [HttpGet]
        public async Task<IActionResult> Details(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }
            var courses = await _context.Courses.FirstOrDefaultAsync(m => m.ID == id);
            if (courses == null)
            {
                return NotFound();
            }
            ViewBag.action = "Details";
            return View("Delete", courses);
        }
    }
}

Andmebaasi kontekst

        private readonly SchoolContext _context;

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

SchoolContext on Entity Frameworki DbContext

Dependency Injectioni tehakse sellele autamaatselt

_context.Courses tähendab Course tabeli

Index

        public IActionResult Index()
        {
            var courses = _context.Courses.Include(c => c.Department)
                .AsNoTracking();
            Console.WriteLine(courses);
            return View(courses);
        }

Näitab kõiki kursuseid nimekirjas koos osakonna andmedega vaatesse

Create Get

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

Kuvab uue kursuse tegemis vormi ja täidab rippmenüü osakondade jaoks

Create Post

        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create([Bind("Title,Credits,Department,DepartmentID,Enrollments,CourseAssignments")]Course courses)
        {
            ViewData["action"] = "Create";
            if (ModelState.IsValid)
            {
                 _context.Courses.Add(courses);
                await _context.SaveChangesAsync();
                return RedirectToAction("Index");
                //PopulateDepartmentsDropDownList(course.DepartmentID);
            }
            PopulateDepartmentsDropDownList();
            return View(courses);

        }

salvestab kursuse andmebaasi kui vormi andmed on õiged:

Edit Get

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

kuvab kursuse muutmise vormi (kasutab sama vaadet nagu create)

Edit Post

        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> EditConfirmed(int id, [Bind("ID,Title,Credits,Department,DepartmentID,Enrollments,CourseAssignments")] Course courses)
        {
            if (ModelState.IsValid)
            {
                _context.Courses.Update(courses);
                await _context.SaveChangesAsync();
                return RedirectToAction("Index");
            }
            return View(courses);
        }

salvestab muudatused andmebaasi

Details Get

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

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

Delete Get

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

Kuvab kusutamise vaate id järgi

Delete Post

        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> DeleteConfirmed (int id)
        {
            var courses = await _context.Courses.FindAsync(id);
            if (courses == null)
            {
                return NotFound();
            }
            _context.Courses.Remove(courses);
            await _context.SaveChangesAsync();
            return RedirectToAction("Index");
        }

Kustutab kursuse andmebaasist