Bir önceki yazımızda Identity’i projemizi oluşturmuş, gerekli paketleri projemize dahil etmiş, custom user ve role sınıflarımızı tanımlayıp veri tabanımızı oluşturmuştuk. Bu yazımızda Register işlemini yapacağımız control ve view ve viewmodel dosyalarını oluşturacağız.
İlk olarak projenin ana dizinine ViewModels klasörünü ve bu klasör altında da RegisterViewModel sınıfını oluşturup bu sınıfı aşağıdaki şekilde düzenliyoruz.
using System.ComponentModel.DataAnnotations;
namespace IdentityCustomProject.ViewModel
{
public class RegisterViewModel
{
[Required]
public string Name { get; set; }
[Required]
public string Surname { get; set; }
[Required]
public string UserName { get; set; }
[Required]
[EmailAddress]
public string Email { get; set; }
[Required]
[DataType(DataType.Password)]
public string Password { get; set; }
[DataType(DataType.Password)]
[Compare("Password", ErrorMessage = "Password and confirmation do not match")]
public string ConfirmPassword { get; set; }
}
}
Ardından oluşturmuş olduğumuz bu ViewModels klasörünü projenin tüm view dosyalarında tanınması için Views / Shared / _ViewImports.cshtml razorview’ına aşağıdaki kodu ekliyoruz.
@using IdentityCustomProject.ViewModels
Views klasörünün altına Account adında bir klasör oluşturuyor, bu klasörün altında da Register adında bir razorview oluşturuyoruz ve aşağıdaki şekilde düzenliyoruz.
@model RegisterViewModel
@{
ViewData["Title"] = "Register";
}
<h2>User Register</h2>
<div>
<div class=col-md-12>
<form method="post">
<div asp-validation-summary="All" class="text-danger"></div>
<div class="mb-3">
<input asp-for="Name" class="form-control" placeHolder="Name" />
<span asp-validation-for="Name" class="text-danger"></span>
</div>
<div class="mb-3">
<input asp-for="Surname" class="form-control" placeHolder="Surname" />
<span asp-validation-for="Surname" class="text-danger"></span>
</div>
<div class="mb-3">
<input asp-for="UserName" class="form-control" placeHolder="Username" />
<span asp-validation-for="UserName" class="text-danger"></span>
</div>
<div class="mb-3">
<input asp-for="Email" type="email" class="form-control" placeHolder="Email" />
<span asp-validation-for="Email" class="text-danger"></span>
</div>
<div class="mb-3">
<input asp-for="Password" type="password" class="form-control" placeHolder="Password" />
<span asp-validation-for="Password" class="text-danger"></span>
</div>
<div class="mb-3">
<input asp-for="ConfirmPassword" type="password" class="form-control" placeHolder="Confirm Password" />
<span asp-validation-for="ConfirmPassword" class="text-danger"></span>
</div>
<button type="submit" class="btn btn-primary">Register</button>
</form>
</div>
</div>
Hazır views klasörüne girmişken Views / Shared / _Layout.cshtml dosyasında bulunan Bootstrap kodlarında da ufak bir değişiklik yaparak sitenin sağ üst kısmına Register linkini yerleştirelim. Bunun için Boostrap’in navbar divinin içine aşağıdaki kodları da ekliyoruz.
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link text-dark" asp-controller="Account" asp-action="Register">Register</a>
</li>
</ul>
Yukarıda kodlarda görüldüğü gibi asp-controller’a Account, asp-action’a da Register değerlerini veriyoruz. Zira bir sonraki aşamada Account kontrolör sınıfının ve bu sınıf içinde de Register action’ını ouşturacağız. O halde Account kontrolörünü oluşturmaya geçelim.
Controllers klasörünün altına AccountController.cs dosyasını oluşturuyoruz. Bu kontrolör Register ve Login gibi işlemlerin bulunduğu kontrolör olacak. Öncelikle Register işlemiyle başlayacağız. Bir adet constructor method ile [HttpGet] ve [HttpPost] attribute ile işaretleniş ve HttpPost işleminin async çalışacağı 2 adet metot oluşturup aşağıdaki gibi şekilde düzenliyoruz.
using IdentityCustomProject.Models;
using IdentityCustomProject.ViewModels;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
namespace IdentityCustomProject.Controllers
{
public class AccountController : Controller
{
private readonly UserManager<AppUser> _userManager;
private readonly SignInManager<AppUser> _signInManager;
public AccountController(UserManager<AppUser> userManager, SignInManager<AppUser> signInManager)
{
_userManager = userManager;
_signInManager = signInManager;
}
[HttpGet]
public IActionResult Register()
{
return View();
}
[HttpPost]
public async Task<IActionResult> Register(RegisterViewModel registerViewModel)
{
if (ModelState.IsValid)
{
user = new AppUser()
{
Name = registerViewModel.Name,
Surname = registerViewModel.Surname,
UserName = registerViewModel.UserName,
Email = registerViewModel.Email
};
var result = await _userManager.CreateAsync(user, registerViewModel.Password);
if (result.Succeeded)
{
await _signInManager.SignInAsync(user, isPersistent: false);
return RedirectToAction("Index", "home");
}
foreach (var error in result.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
//}
}
return View(registerViewModel);
}
}
}
}
Yukarıdaki kodları inceleyecek olursak; kurucu metot aracılığıyla kontrolöre inject ettğimiz ve birer örneğini oluşturduğumuz UserManager ve SignInManager sınıflarımız bulunmakta. UserManager sınıfı yardımıyla kullanıcı ekleme, silme, düzenleme vb. işlemleri, SignInManager sınıfı ile de oturum açma oturum kapatma, oturum kontrolü vb. işlemleri gerçekleştirebiliyoruz.