Model Binding 2 - Modelde Belirli Alanları Doldurmak

Model Binding 2 - Modelde Belirli Alanları Doldurmak

Blog Model Binding 2 - Modelde Belirli Alanları Doldurmak

Model Binding 2 - Modelde Belirli Alanları Doldurmak

SelamünAleyküm, geçtiğimiz yazıda Model Binding'e giriş yapmıştık ve Query Sring ile Model Binding konusunu ele alıyorduk. Bu yazıda geçtiğimiz konuyu bitirip ardından bu yazının asıl konusu olan "Modelde Belirli Alanları Doldurmak" üzerinden devam edeceğiz.

Form ile Liste Göndermek

Formdan bir liste alıp almadığımız listeleri Controller tarafına, liste olarak tanımlanmış parametrelere eşleştirebiliriz.

Misalen, HomeController isminde Controller'imiz olsun ve içinde string tipinde verileri alıp göndereceğimiz metotları olsun.

public class HomeController : Controller
{
    public List<string> Index(List<string> names)
    {
        return names;
    }

    [HttpGet]
    public IActionResult Create()
    {
        return View();
    }

    [HttpPost]
    public IActionResult Create(List<string> names)
    {
        return View("Index", names);
    }
}

Create Action metodumuza View ekleyelim ve verileri alacağımız formu View'in içerisine yazalım.

@model List<string>
@{
    Layout = null;
}

@using (Html.BeginForm("Create"))
{

    @for(int i = 0; 1 < 9; i++)
    {
        <table>
             <tr>
                <td>
                    İsim: @(i + 1)
                </td>
                <td>
                    <input type="text" names="names" id="names" value="" />
                </td>
             </tr>
        </table>
    } 

    <input type="button" value="Kaydet" />
}

Formdan aldığımız verileri Index View'ine yazdıralım.

@model List<string>
@{
    Layout = null;
}

@foreach(var item in Model)
{
    @item <br />
}

Projemizi çalıştıralım ve https://locolhost:44895/Home/Create adresi ile web tarayıcımızdan istekte bulunalım.

Formumuzu doldurduktan sonra Kaydet butonuna tıklayalım.

Formdan aldığımız verileri ekrana yazdırmış olduk.

yukarıda for döngüsü ile 9 adet isimler listesini aldığımız veriyi Action metodundaki List<string> names olarak tanımladığımız parametre ile eşleştirdik.

Modelde Belirli Alanları Doldurmak

Bazı vakitler Modelde var olan bütün alanları doldurmak istemeyebiliriz. Bu alanlar gelse bile biz bu alanları boş kabul edebiliriz. Bu tür durumlarda doldurmak istediğimiz alanları Action metodumuzda belirtip sadece bu alanları modelde doldurabiliriz.

Misalen, Student isimli bir sınıfımız olsun. Bu sınıfa Student içinde yer alacak Property'leri belirtelim.

public class Student
{
    public long IdentificationNumber { get; set; }
    public string Name { get; set; }
    public string Surname{ get; set; }
    public string FatherName { get; set; }
    public string MotherName { get; set; }
    public ClassRoom ClassRoom { get; set; }
}

public class ClassRoom
{
    public int ClassNumser { get; set; }
    public Teacher Teacher { get; set; }
}

public class Teacher
{
    public string TeacherName{ get; set; }
    public string TeacherSurname{ get; set; }
}

Student isimli bir Model Oluşturduk. Bu Modelde ClassRoom isimli bir sınıf ekledik. ClassRoom'da ise Teacher sınıfını ekledik. Student sınıfında  öğrenciye ait özellikleri, ClassRoom sınıfında okuldaki sınıfa ait özellikleri, Teacher sınıfında ise öğretmene ait özellikleri Property'leri tanımladık.

Student adında bir Controller oluşturup, buraya Create isimli bir Action metodu oluşturalım.

[HttpGet]
public IActionResult Create()
{
    return View();
}

Create Action metodunda ait bir View oluşturalım.

View tarafındında oluşturduğumuz Modele uygun bir şeklide form yapısı oluşturalım ve bu forma gerekli tanımlamaları yapalım.

@model Model_Binding_2___Modelde_Belirli_Alanları_Doldurmak.Models.Student

@{
    Layout = null;
}

@using (Html.BeginForm("Create"))
{
    <table>
        <tr>
            <td>Kimlik No: </td>
            <td>
                <input id="IndentificationNumber" name="IndentificationNumber" type="text" />
            </td>
        </tr>
        <tr>
            <td>Öğrencinin Adı: </td>
            <td>
                <input id="Name" name="Name" type="text" />
            </td>
        </tr>
        <tr>
            <td>Öğrencinin Soyadı: </td>
            <td>
                <input id="Surname" name="Surname" type="text" />
            </td>
        </tr>
        <tr>
            <td>Öğrencinin Baba Adı: </td>
            <td>
                <input id="FatherName" name="FatherName" type="text" />
            </td>
        </tr>
        <tr>
            <td>Öğrencinin Anne Adı: </td>
            <td>
                <input id="MotherName" name="MotherName" type="text" />
            </td>
        </tr>
        <tr>
            <td>Öğrencinin Sınıf Numarası: </td>
            <td>
                <input id="ClassRoom.ClassNumber" name="ClassRoom.ClassNumber" type="text" />
            </td>
        </tr>
        <tr>
            <td>Öğrencinin Öğretmeninin Adı: </td>
            <td>
                <input id="ClassRoom.Teacher.TeacherName" name="ClassRoom.Teacher.TeacherName" type="text" />
            </td>
        </tr>
        <tr>
            <td>Öğrencinin Adı: </td>
            <td>
                <input id="ClassRoom.Teacher.TeacherSurname" name="ClassRoom.Teacher.TeacherSurname" type="text" />
            </td>
        </tr>
        <tr>
           
            <td>
                <input type="submit" value="Kaydet" />
            </td>
        </tr>
    </table>
}

Formu oluşturduktan sonra bu formdan alacağımız verileri görmek için StudentController'deki Index Action metodumuz olsun.

Bu Action metodu parametre olarak Student adlı modelimizi alsın.

public IActionResult Index(Student student)
{
    return View(student);
}

Action metodumuzda View dosyası oluşturalım ve Student modelimizin porperty'lerini View'de yazalım.

@model Model_Binding_2___Modelde_Belirli_Alanları_Doldurmak.Models.Student

@{
    Layout = null;
}

<table>
    <tr>
        <td>Kimlik No: </td>
        <td>
            @Model.IndentificationNumber
        </td>
    </tr>
    <tr>
        <td>Öğrencinin Adı: </td>
        <td>
            @Model.Name
        </td>
    </tr>
    <tr>
        <td>Öğrencinin Soyadı: </td>
        <td>
            @Model.Surname
        </td>
    </tr>
    <tr>
        <td>Öğrencinin Baba Adı: </td>
        <td>
            @Model.FatherName
        </td>
    </tr>
    <tr>
        <td>Öğrencinin Anne Adı: </td>
        <td>
            @Model.MotherName
        </td>
    </tr>
    <tr>
        <td>Öğrencinin Sınıf Numarası: </td>
        <td>
            @Model.ClassRoom.ClassNumber
        </td>
    </tr>
    <tr>
        <td>Öğrencinin Öğretmeninin Adı: </td>
        <td>
            @Model.ClassRoom.Teacher.TeacherName
        </td>
    </tr>
    <tr>
        <td>Öğrencinin Adı: </td>
        <td>
            @Model.ClassRoom.Teacher.TeacherSurname
        </td>
    </tr>
</table>

Modelimizi ekrana basmak için gereken kodları yazdıktan sonra, doldurmak istediğimiz alanları belirten Create isimli Action metodumuzu yazalım, bu alanları belirttikten sonra ekrana yazması için Index View'ine Student modelimizi gönderelim.

[HttpPost]
public IActionResult Create([Bind(nameof(Student.Name), nameof(Student.Surname), nameof(ClassRoom))]Student student)
{
   return View("Index", student);
}

Action metodumuzda  görüleceği gibi, Student modeline ait özelliklerinde dolu gelmesini istediğmiz alanları tanımladık. ClassRoom sınıfını ekstradan tanımlama sebebimiz de bu alanlar içindeki ClassRoom sınıfını ClassNumber, Teacher içindeki TeacherName ve TeacherSurname'i tanımlamış olsaydık. ClassRoom nesnesi null geleceğinden onun içindeki sınıfa  ve öğretmene ait özellikleri göremeyecektik.

Şimdi projemizi çalıştıralım ve StudentController içindeki Create metodumuza istek gönderelim.

Ekrandaki tüm alanları dolduralım ve Kaydet butonun basalım.

Bütün alanları doldurmamıza rağmen Kimlik No, Öğrencinin Baba Adı ve Öğrencinin Anne Adı boş geldi. Bunun nedeni boş gelen alanları Action metodunda belirtmediğimizdendir. Böylelikle metodumuz bu alanları boş getirdi. (IdentificationNumber (Kimlik No) alanını long olarak tanımladığımız için 0 olarak geldi.)

Doldurmak istediğimiz alanları Action metodunda belirtebileceğimiz gibi modelin içinde Attribute olarak da belirtebiliyoruz.


    [Bind(nameof(Student.Name), nameof(Student.Surname), nameof(ClassRoom))]
    public class Student
    {
        public long IndentificationNumber { get; set; }
        public string Name { get; set; }
        public string Surname { get; set; }
        public string FatherName { get; set; }
        public string MotherName { get; set; }
        public ClassRoom ClassRoom { get; set; }
        
    }

    public class ClassRoom
    {
        public int ClassNumber { get; set; }
        public Teacher Teacher { get; set; }
    }

    public class Teacher
    {
        public string TeacherName { get; set; }
        public string TeacherSurname { get; set; }
    }

İlk verdiğimiz örnekteki modelin başına doldurmak istediğimiz alanları Attribute olarak yazıp Action metodundan bu alanları silersek yine aynı sonucu alacağızdır.

Bu yazımızın sonuna geldik, Bu yazıda hem geçtiğimiz haftanın yarım kalan konusunu bitirdik hemde bu haftanın konusunu ele aldık. Kısaca Model Binding konusunun ikinci başlığını da incelemiş olduk. ilgili konuya ait projeyi github adresinden bulabilirsiniz. İlgilenenlerin faydalanması ümidiyle.

Hiç yorum Yorum yapılmamış, İlk yorumu sen yap.

Yorum Yap


Bize Ulaşın

Merkez / Mardin

support@technoguide.com.tr

+90 551 859 8721

Haber Bültenİ

Haber Bültenİmİze Kaydolun

Yazılım, teknoloji ve daha fazlası için bizi takip edin.

© Techno Guide. Tüm Hakları Saklıdır.

HTML Codex Tasarımıdır.