TallinnaRakenduslikKolledž Project

In programming class, our main project has been a TallinnaRakenduslikKoledž assignment, the goal of which is to manage teachers and students in a hypothetical school.

The project works using these Controllers, Views, and Models.


public class CoursesController : Controller
{
    private readonly SchoolContext _context;

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

    public async Task<IActionResult> Index()
    {
        var courses = _context.Courses.Include(c => c.Department);
        return View(await courses.ToListAsync());
    }
using System.ComponentModel.DataAnnotations;

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

        public int? GPA { get; set; }
        public ICollection<Commendation>? Commendations { get; set; } /* Kiitused */
        public ICollection<Mark>? Marks { get; set; } /* Märkused */



    }
}
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Course>().ToTable("Course");
            modelBuilder.Entity<Commendation>().ToTable("Commendation");
            modelBuilder.Entity<Enrollment>().ToTable("Enrollment");
            modelBuilder.Entity<Mark>().ToTable("Mark");
            modelBuilder.Entity<Student>().ToTable("Student");
            modelBuilder.Entity<Instructor>().ToTable("Instructor");
            modelBuilder.Entity<CourseAssignment>().ToTable("CourseAssignment");
            modelBuilder.Entity<OfficeAssignment>().ToTable("OfficeAssignment");
            modelBuilder.Entity<Department>().ToTable("Department");
            modelBuilder.Entity<Book>().ToTable("Books");
            modelBuilder.Entity<Delinquent>().ToTable("Delinquents");

        }
<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>

Views

Each view controls a different part of the project.

The Books view controls the Books model, which was supposed to show what books were in the College. The Courses view shows what courses are in the College. The Delinquents view shows the delinquents in the College. The Departments view shows the jobs in the College. The Instructors view shows the employees in the College. The Students view shows all the teachers in the College.

@model IEnumerable<TallinnaRakenduslikKolledzKaur.Models.Book>

@{
	ViewData["Title"] = "Raamatud";
}
<h2>Raamatud</h2>
<p>
	<a asp-action="Create">Tee uus raamat</a>
</p>

<table class="table">
	<thead>
		<tr>
			<th>@Html.DisplayNameFor(Model => Model.BookId)</th>
			<th>@Html.DisplayNameFor(Model => Model.Title)</th>
			<th>@Html.DisplayNameFor(Model => Model.PageCount)</th>
			<th>@Html.DisplayNameFor(Model => Model.TotalStock)</th>
			<th>@Html.DisplayNameFor(Model => Model.AmountBorrowed)</th>
			<th>@Html.DisplayNameFor(Model => Model.CurrentStock)</th>
			<th>Tööriistad</th>
		</tr>
	</thead>

	<tbody>
		@foreach (var books in Model)
		{
			<tr>
				<td>@Html.DisplayFor(modelItem => books.BookId)</td>
				<td>@Html.DisplayFor(modelItem => books.Title)</td>
				<td>@Html.DisplayFor(modelItem => books.PageCount)</td>
				<td>@Html.DisplayFor(modelItem => books.TotalStock)</td>
				<td>@Html.DisplayFor(modelItem => books.AmountBorrowed)</td>
				<td>@Html.DisplayFor(modelItem => books.CurrentStock)</td>
				<td>
					<a asp-action="Delete" asp-route-id="@books.BookId">Kustuta</a>
					<a asp-action="Details" asp-route-id="@books.BookId">Details</a>
					<a asp-action="Edit" asp-route-id="@books.BookId">Edit</a>
				</td>
			</tr>
		}
	</tbody>
</table>
@model TallinnaRakenduslikKolledzKaur.Models.Book
@{ViewData["Title"] = "Uus Kursus";}
<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="CourseId" class="control-label"></label>
				<input asp-for="CourseId" class="form-control" />
				<span asp-validation-for="CourseId" 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="PageCount" class="control-label"></label>
				<input asp-for="PageCount" class="form-control" />
				<span asp-validation-for="PageCount" class="text-danger"></span>
			</div>
			<div>
				<label asp-for="TotalStock" class="control-label"></label>
				<input asp-for="TotalStock" class="form-control" />
				<span asp-validation-for="TotalStock" class="text-danger"></span>
			</div>
			<div>
				<label asp-for="AmountBorrowed" class="control-label"></label>
				<input asp-for="AmountBorrowed" class="form-control" />
				<span asp-validation-for="AmountBorrowed" 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>
odel IEnumerable<TallinnaRakenduslikKolledzKaur.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.DepartmentID)</th>	 -->
			<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.Accomplishments)</th>
			<th>@Html.DisplayNameFor(Model => Model.WastedHours)</th>   <!-- woag, -->
			<th>Tööriistad</th>
		</tr>
	</thead>
	<tbody>
		@foreach(var department in Model)
		{
			<tr>
				<!--<td>@Html.DisplayFor(modelItem => department.DepartmentID)</td>	  -->
				<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.Accomplishments) </td>
				<td> @Html.DisplayFor(modelItem => department.WastedHours) </td>
				<td>
					@* /* Muuda */ *@
					<a asp-action="Edit" asp-route-id="@department.DepartmentID" class="btn btn-primary">Edit</a>
					@* /* Vaata */ *@
					<a asp-action="Details" asp-route-id="@department.DepartmentID" class="btn btn-primary">Detail</a>
					@* /* Vaata Admin */ *@

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

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

<h1>Copy õpilane</h1>
<hr />
<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.Commendations)</dt>
		<dd class="col-sm-10">@Html.DisplayFor(Model => Model.Commendations)</dd>
	</dl>

	<dl class="row">
		<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.Enrollments)</dt>
		<dd class="col-sm-10">@Html.DisplayFor(Model => Model.Enrollments)</dd>
	</dl>


	<dl class="row">
		<dt class="col-sm-2">@Html.DisplayNameFor(Model => Model.Marks)</dt>
		<dd class="col-sm-10">@Html.DisplayFor(Model => Model.Marks)</dd>
	</dl>

</div>
<form asp-action="Clone">
	<input type="hidden" asp-for="Id" />
	<input type="submit" asp-route-id="Id"value="Clone" class="btn btn-primary" /> | <a asp-action="Index">Tühista</a>
</form>

Controllers

Every View needs a Controller to work.

        public async Task<IActionResult> Delete(int? Id)
        {
            if (Id == null)
            {
                return NotFound();
            }
            var delinquent = await _context.Delinquents.FirstOrDefaultAsync(d => d.BreakerId == Id);
            if (delinquent == null)
            {
                return NotFound();
            }
            return View(delinquent);
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Delete(Delinquent delinquent)
        {
            if (await _context.Delinquents.AnyAsync(d => d.BreakerId == delinquent.BreakerId))
            {
                _context.Delinquents.Remove(delinquent);
                await _context.SaveChangesAsync();
            }
            return RedirectToAction("Index");
        }
    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());
        }

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

namespace TallinnaRakenduslikKolledzKaur.Controllers
{
    public class InstructorsController : Controller
    {
        private readonly SchoolContext _context;
        public InstructorsController(SchoolContext context)
        {
            _context = context;
        }
        public async Task<IActionResult> Index(int? id, int? courseId)
        {
            var vm = new InstructorIndexData();
            vm.Instructors = await _context.Instructors
            .Include(i => i.OfficeAssignment)
            .Include(i => i.CourseAssignments)
            .ToListAsync();
            return View(vm);
        }

        [HttpGet]
        public IActionResult Create()
        {
            var instructor = new Instructor();
            instructor.CourseAssignments = new List<CourseAssignment>();
            return View();
        }
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create(Instructor instructor, string selectedCourses)
        {
            if (selectedCourses == null)
            {
                instructor.CourseAssignments = new List<CourseAssignment>();
                if (selectedCourses != null)
                {
                    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);
        }
        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;
        }
        [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, 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");
        }
        [HttpGet]
        public async Task<IActionResult> Details(int? Id)
        {
            if (Id == null)
            {
                return NotFound();
            }
            var instructor = await _context.Instructors.FirstOrDefaultAsync(m => m.Id == Id);
            if (instructor == null)
            {
                return NotFound();
            }
            return View(instructor);
        }
        [HttpGet]
        public async Task<IActionResult> Edit(int? Id)
        {
            if (Id == null)
            {
                return NotFound();
            }
            var instructor = await _context.Instructors.FirstOrDefaultAsync(m => m.Id == Id);
            if (instructor == null)
            {
                return NotFound();
            }
            _context.Instructors.Update(instructor);
            return View(instructor);
        }
        [HttpPost, ActionName("Edit")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> EditConfirmed([Bind("Id,LastName,FirstName,HireDate,CourseAssignments,OfficeAssignment,VacationDays,Comments,BirthDate,Status")] Instructor instructor)
        {
            _context.Instructors.Update(instructor);
            await _context.SaveChangesAsync();
            return RedirectToAction("Index");
        }
        public async Task<IActionResult> Quickedit(int? Id)
        {
            if (Id == null)
            {
                return NotFound();
            }
            var instructor = await _context.Instructors.FirstOrDefaultAsync(m => m.Id == Id);
            if (instructor == null)
            {
                return NotFound();
            }
            _context.Instructors.Update(instructor);
            return View(instructor);
        }
        [HttpPost, ActionName("Quickedit")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> QuickeditConfirmed([Bind("Id,LastName,FirstName,HireDate,CourseAssignments,OfficeAssignment,VacationDays,Comments,BirthDate,Status")] Instructor instructor)
        {
            _context.Instructors.Update(instructor);
            await _context.SaveChangesAsync();
            return RedirectToAction("Index");
        }
    }
}

Models

These are necessary for the Database.

using System.ComponentModel.DataAnnotations;

namespace TallinnaRakenduslikKolledzKaur.Models
{
    public class Book
    {
        [Key]
        public int BookId { get; set; }
        public string Title { get; set; }
        public int? PageCount { get; set; }
        public int TotalStock { get; set; }
        public int? AmountBorrowed { get; set; }
        public int? CurrentStock
        {
            get { return TotalStock-AmountBorrowed; }
        }


    }
}
using System.ComponentModel.DataAnnotations;

namespace TallinnaRakenduslikKolledzKaur.Models
{
    public class Course
    {
        [Key]
        public int CourseId { get; set; }
        public string Title { get; set; }
        public int Credits { get; set; }

        public ICollection<Enrollment>? Enrollments { get; set; }
        public Department? Department { get; set; }
        public int? DepartmentID { get; set; }
        public ICollection<CourseAssignment>? CourseAssignments { get; set; }
    }
}
using System.ComponentModel.DataAnnotations;

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

        public int? GPA { get; set; }
        public ICollection&lt;Commendation>? Commendations { get; set; } /* Kiitused */
        public ICollection&lt;Mark>? Marks { get; set; } /* Märkused */



    }
}

Rohkem Detailid: