Tallinna Rakenduslik Kolledž
Projekti eesmärk ja lühiselgitus
Projekti eesmärk oli luua ASP.NET Core MVC veebirakendus, millega saab hallata Tallinna Rakenduslik Kolledži andmeid (nt õpilased, kursused, õpetajad vms).
Rakendus kasutab MVC arhitektuuri, Entity Framework Core’i ning LINQ-päringuid, et eraldada loogika, andmed ja kasutajaliides ning tagada selge ja hooldatav koodistruktuur.
Mida projekt võimaldab
- Andmete lisamist, muutmist ja kustutamist.
- Andmete kuvamist kasutajale vaadete kaudu.
- Andmete salvestamist andmebaasi.
MVC struktuuri kasutamine projektis
Projekt on ehitatud (Model–View–Controller) ehk MVC järgi.
Siin on MVC struktuur Models kaustast.
Modelid kirjeldavad andmebaasi tabeleid ja nende omadusi.
Selgitus: Iga mudel vastab ühele andmebaasi veerule
ICollection<Enrollment> kirjeldab seost teiste tabelitega.
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 string? HomeAddress { get; set; }
public int? Age { get; set; }
public string? Email { get; set; }
}
}
(Controllers kaust) StudentsController
Kontrollerid vahendavad kasutaja tegevusi ja andmebaasi.
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,LastName, FirstName, EnrollmentDate, GradesPerAverage")] Student student)
{
if (ModelState.IsValid)
{
_context.Students.Add(student);
await _context.SaveChangesAsync();
return RedirectToAction("Index");
}
return View(student);
}
/**/
/// <summary>
/// get delete view for student
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[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");
}
[HttpGet]
public async Task<IActionResult> Details(int id)
{
var student = await _context.Students.FindAsync(id);
return View(student);
}
[HttpGet]
public async Task<IActionResult> Edit (int id)
{
var student = await _context.Students.FindAsync(id);
return View(student);
}
[HttpPost, ActionName("Edit")]
public async Task<IActionResult> Edit([Bind("Id,LastName, FirstName, EnrollmentDate, GradesPerAverage")] Student student)
{
if (ModelState.IsValid)
{
_context.Students.Update(student);
await _context.SaveChangesAsync();
return RedirectToAction("Index");
}
return View(student);
}
}
}
Näide: Students Controller
Selgitus
- Kuvab kõiki õpilasi.
- Kasutatud LINQ meetodit.
ToListAsync()– tagastab andmed listina.
public async Task<IActionResult> Index()
{
return View(await _context.Students.ToListAsync());
}
Selgitus:
- Kuvab ühe õpilase detaile.
- Kasutab LINQ meetodit.
FirstOrDefaultAsync()– otsib esimese vaste või tagastab nulli.
public async Task<IActionResult> Details(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);
}
Koodinäide: LINQ meetodite kasutamine kontrolleris
StudentsController – Index meetod
Selgitus:
Selles meetodis kasutatakse LINQ meetodit, et sorteerida andmeid enne vaatesse saatmist.
Kasutatud LINQ meetodid:
OrderBy()– Sorteerib õpilased perekonnanime järgi.ThenBy()– Sorteerib sama perekonnanime korral eesnime järgi.ToListAsync()– Teisendab päringu nimekirjaks ja käivitab selle asünkroonselt.
See tagab, et:
- Andmed on kasutajale loogilises järjekorras.
- Sorteerimine toimub andmebaasis.
public async Task<IActionResult> Index()
{
var students = _context.Students
.OrderBy(s => s.LastName)
.ThenBy(s => s.FirstName)
.ToListAsync();
return View(await students);
}
LINQ-näide: Details meetod
Selgitus:
LINQ meetodid:
Include()– Laeb seotud andmed (õpilase kursused).ThenInclude()– Laeb kursuste detailid.FirstOrDefaultAsync()– Otsib konkreetse ID-ga õpilase.
See võimaldab kuvada detailvaates:
- Õpilaste aindmeid.
- Selle õpilase kursuseid ja hindeid.
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var student = await _context.Students
.Include(s => s.Enrollments)
.ThenInclude(e => e.Course)
.FirstOrDefaultAsync(s => s.ID == id);
if (student == null)
{
return NotFound();
}
return View(student);
}