ASP NET CORE RAZOR PAGE BAKIM TEKNİK SERVİS PROJESİ DERS 014 REGISTER YAPISI

Projemizi oluşturduğumuzda ASP.NET Core Identity kullandığımız için benim Register.cshtml ve Register.cshtml.cs adında iki tane dosyam var şimdi Register.cshtml.cs kodlarını şöyle yüzeysel olarak inceleyelim.

Dersin video versiyonu için:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Text.Encodings.Web;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.UI.Services;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.WebUtilities;
using Microsoft.Extensions.Logging;

namespace GursoyCNCBakim.Areas.Identity.Pages.Account
{
    [AllowAnonymous]
    public class RegisterModel : PageModel
    {
        private readonly SignInManager< IdentityUser > _signInManager;
        private readonly UserManager< IdentityUser > _userManager;
        private readonly ILogger< RegisterModel > _logger;
        private readonly IEmailSender _emailSender;

        public RegisterModel(
            UserManager< IdentityUser > userManager,
            SignInManager< IdentityUser > signInManager,
            ILogger< RegisterModel > logger,
            IEmailSender emailSender)
        {
            _userManager = userManager;
            _signInManager = signInManager;
            _logger = logger;
            _emailSender = emailSender;
        }

        [BindProperty]
        public InputModel Input { get; set; }

        public string ReturnUrl { get; set; }

        public IList< AuthenticationScheme > ExternalLogins { get; set; }

        public class InputModel
        {
            [Required]
            [EmailAddress]
            [Display(Name = "Email")]
            public string Email { get; set; }

            [Required]
            [StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)]
            [DataType(DataType.Password)]
            [Display(Name = "Password")]
            public string Password { get; set; }

            [DataType(DataType.Password)]
            [Display(Name = "Confirm password")]
            [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
            public string ConfirmPassword { get; set; }
        }

        public async Task OnGetAsync(string returnUrl = null)
        {
            ReturnUrl = returnUrl;
            ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
        }

        public async Task< IActionResult > OnPostAsync(string returnUrl = null)
        {
            returnUrl = returnUrl ?? Url.Content("~/");
            ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
            if (ModelState.IsValid)
            {
                var user = new IdentityUser { UserName = Input.Email, Email = Input.Email };
                var result = await _userManager.CreateAsync(user, Input.Password);
                if (result.Succeeded)
                {
                    _logger.LogInformation("User created a new account with password.");

                    var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
                    code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
                    var callbackUrl = Url.Page(
                        "/Account/ConfirmEmail",
                        pageHandler: null,
                        values: new { area = "Identity", userId = user.Id, code = code, returnUrl = returnUrl },
                        protocol: Request.Scheme);

                    await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
                        $"Please confirm your account by clicking here.");

                    if (_userManager.Options.SignIn.RequireConfirmedAccount)
                    {
                        return RedirectToPage("RegisterConfirmation", new { email = Input.Email, returnUrl = returnUrl });
                    }
                    else
                    {
                        await _signInManager.SignInAsync(user, isPersistent: false);
                        return LocalRedirect(returnUrl);
                    }
                }
                foreach (var error in result.Errors)
                {
                    ModelState.AddModelError(string.Empty, error.Description);
                }
            }

            // If we got this far, something failed, redisplay form
            return Page();
        }
    }
}


Objectler tanımlanmış, RegisterModel oluşturulmuş ve DI yöntemi kullanılmış atama işlemleri gerçekleştirilmiş. Post metodum ilgili propertye bağlanmış. Email adres ve şifre alanlarımız tanımlanmış. Bunların validasyonları oluşturulmuş. Hata mesajları yazılmış. Daha sonra kayıt için ilgili kodlar yazılmış, gerekirse konfirmasyon kontrolü yapılabilirlik, token ile doğrula kontrolleri yazılmış.

Şimdi ben Register yani kaydolma sayfasını açtığımda sadece email, şifre ve şifre doğrulama alanlarını görüyorum. Ben buraya kayıt olma esnasında ad-soyad (tek hanede), adres, şehir, posta kodu ve telefon numarası bilgisi de girilsin ve kayıt işlemi tamamlansın istiyorum.

Bununla ilişkili database tarafında ilgili tabloma baktığımda email, şifre ve telefon alanları mevcut. Kullanıcı alanı da mevcut ama ben ad ve soyadı ayrıca tutmak istiyorum.

Geriye ne kalıyor benim istediklerimden? Ad-Soyad, Adres, Şehir ve Posta Kodu şimdi bunları veritabanımızda AspNetUsers tablosuna ekleyelim. Bunu yapabilmek için Models klasörüme geliyorum ve yeni bir class ekliyorum. Adını ApplicationUser veriyorum. Kodlarımı yazıyorum:

using Microsoft.AspNetCore.Identity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace GursoyCNCBakim.Models
{
    public class ApplicationUser : IdentityUser
    {
        public string AdSoyad { get; set; }
        public string Adres { get; set; }
        public string Sehir { get; set; }
        public string PostaKodu { get; set; }
    }
}


Bu yazdığım propertyleri database tarafına yansıtabilmek için Data klasöründe yer alan ApplicationDbContext classıma geliyor ve buraya ilgili kodu ekliyorum.

using System;
using System.Collections.Generic;
using System.Text;
using GursoyCNCBakim.Models;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;

namespace GursoyCNCBakim.Data
{
    public class ApplicationDbContext : IdentityDbContext
    {
        public ApplicationDbContext(DbContextOptions< ApplicationDbContext > options)
            : base(options)
        {
        }

        public DbSet< BakimTipi > BakimTipi { get; set; }
        public DbSet< ApplicationUser > ApplicationUser { get; set; }
    }
}

Daha sonra benim migration eklemem gerekiyor. Bunun için Package Manager Console’da yeni bir migration oluşturuyorum.

Add-migration EkleKullaniciTablosunaOzellik diyerek yeni bir migration oluşturdum.

using Microsoft.EntityFrameworkCore.Migrations;

namespace GursoyCNCBakim.Data.Migrations
{
    public partial class EkleKullaniciTablosunaOzellik : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.AddColumn< string >(
                name: "AdSoyad",
                table: "AspNetUsers",
                nullable: true);

            migrationBuilder.AddColumn< string >(
                name: "Adres",
                table: "AspNetUsers",
                nullable: true);

            migrationBuilder.AddColumn< string >(
                name: "PostaKodu",
                table: "AspNetUsers",
                nullable: true);

            migrationBuilder.AddColumn< string >(
                name: "Sehir",
                table: "AspNetUsers",
                nullable: true);

            migrationBuilder.AddColumn< string >(
                name: "Discriminator",
                table: "AspNetUsers",
                nullable: false,
                defaultValue: "");
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropColumn(
                name: "AdSoyad",
                table: "AspNetUsers");

            migrationBuilder.DropColumn(
                name: "Adres",
                table: "AspNetUsers");

            migrationBuilder.DropColumn(
                name: "PostaKodu",
                table: "AspNetUsers");

            migrationBuilder.DropColumn(
                name: "Sehir",
                table: "AspNetUsers");

            migrationBuilder.DropColumn(
                name: "Discriminator",
                table: "AspNetUsers");
        }
    }
}


İçerisine görüleceği üzere yeni sütunlar gelmiş durumda.

Şimdi bunu database tarafına yansıtabilmek için update-database diyorum.

Database tarafına ilgili alanları yansıttım şimdi Register sayfası üzerinde tasarımsal düzenlemeler yapmam lazım, bunu bir sonraki derste yapacağız. Görüşmek üzere.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir