Showing posts with label AngularJs. Show all posts
Showing posts with label AngularJs. Show all posts

Tuesday, March 29, 2016

Angularjs ve ASP.NET MVC ile Javascript Diziler Kullanılarak Dinamik Çoklu Veri Gönderimi - Sending Dynamic Multi Post Data Using Javascript Arrays With Angularjs and ASP.NET MVC

Bu yazıda ASP.NET MVC üzerinde angularjs kullanılarak kullanıcıdan alınan çoklu veri girişlerinin bir dizi içinde tutularak AJAX ile sunucuya gönderilmesi ve sunucuda işlenmesi sağlanacaktır. Bu amaçla oluşturacağımız giriş kontrolünün CSS kodlarını tanımlayalım.

<style>

    .mainContainerAngularExample {

        width:300px;
        margin:10px;
    }

    .detailAngularExample {

        margin-top:10px;
    }

    .detailAngularExample input:focus {

        background-color:lightblue;
    }

    .footerAngularExample {

        margin-top:10px;
        text-align:right;
    }

    .arrayContainerAngularExample {

        margin-top:10px;
        color:coral    
    }

</style>

Sonraki aşamada DOM elementleri ve veri katmanı arasındaki bağlantıyı tanımlamak için angularjs kodlarını yazalım. Aşağıdaki kodlarda "myApp" modulü altında "MainCtrl" kontrolcüsü tanımlanmaktadır. Scope (Kapsam) içinde yer alan "addItem" fonksiyonu ile diziye elemen eklenmekte ve "removeItem" ile diziden eleman silinmektedir. Bu amaçla diziler üzerinde tanımlı "splice" fonksiyonu kullanılmıştır. Scope içinde yer alan "id" değişkeni ile dizi elemanlarının isimlendirilmesi yapılmaktadır. Ayrıca eğer gerekli olursa (dizi içinde yer alan elemanların tekrar ekmesi durumunda) "id" eşsiz anahtar olarak da kullanılabilir. Burada en önemli nokda dizi içinde nesne(object) kullanılmasıdır. "np-repeat" işlemi gerçekleştirirken kendi scope (kavramı) nesnesini yaratmaktadır. Bu sırada javascript prototype yapısından dolayı "primitive (ilkel)" değişkenlerin değeri programlama dillerindeki fonksiyonlara parametre gönderilirken ki durumla benzer olarak kopyalanmaktadır. Bu sebeple dizi içindeki değişikliğin "parentScope" üzerinde geçerli olabilmesi için dizi içinde referans olarak JSON nesnesi kullanılmıştır.

var app = angular.module('myApp', []);

app.controller('MainCtrl', ['$scope','$http',function ($scope, $http) {

    $scope.pages = [
        { val: 'Item 1' }
    ];

    $scope.id = 1;

    $scope.addItem = function (index) {

        $scope.id++;
        $scope.pages.splice(index + 1, 0, { val: 'Item ' + $scope.id });
    }

    $scope.removeItem = function (index) {

        if (index != 0)
            $scope.pages.splice(index, 1);
    }

    $scope.saveData = function () {

        $http.post("./Home/SaveData", $scope.pages).success(function () {

            alert("Veriler Başarıyla Kaydedildi.");

        }).error(function () {
            
            alert("Veriler Kaydedilirken Bir Hata Oluştu!");
        });
    }
}]);

Sonraki aşamada HTML kodlarını tanımlayalım. Aşağıdaki kodlarda "ng-model" niteliği kullanılarak giriş elementiyle dizi elemanı arasındaki ilişki tanımlanmıştır. "ng-click" kullanılarak kontrolcü içinde yer alan ilgili fonksiyonların tıklanma durumunda çalıştırılması sağlanmaktadır. "ng-hide" ile ilk elemandaki sil tuşunun görünmemesi sağlanmaktadır. "saveData" fonksiyonu kullanılarak üzerinde çalıştığımız dizi AJAX POST isteğiyle sunucuya gönderilmektedir.

<div class="mainContainerAngularExample" ng-app="myApp" ng-controller="MainCtrl">
<div class="detailAngularExample" ng-repeat="page in pages">
<input ng-model="page.val" type="text" />
        <button class="btn btn-default btn-xs" ng-click="addItem($index)" type="button"><span class="glyphicon glyphicon-plus"></span>EKLE</button>
        <button class="btn btn-default btn-xs" ng-click="removeItem($index)" ng-hide="$index === 0" type="button"><span class="glyphicon glyphicon-minus"></span>SİL</button>
    </div>
<div class="footerAngularExample">
<button class="btn btn-success" ng-click="saveData()" type="button"><span class="glyphicon glyphicon-save"></span>KAYDET</button>
    </div>
<div class="arrayContainerAngularExample">
CurrentArray = {{pages}}
    </div>
</div>

Sunucu tarafında "postTemplate" ile gelen verinin bağlanacağı yapı tanımlanmaktadır. Son olarak "SaveData" fonksiyonu ile aşağıdaki gibi AJAX ile gönderilen dizi işlenebilmektedir.

public struct postTemplate
{
     public string val { get; set; }
}

[HttpPost]
public ActionResult SaveData(List<postTemplate> Datas)
{
    return Json("OK");
}

Yukarıdaki kodların çalıştırılması sonucunda aşağıdaki sonuç elde edilmektedir:

CurrentArray = {{pages}}

Sunday, March 20, 2016

Angularjs ve ASP.NET MVC ile Döviz Kurları Uygulaması - Exchange Rates Application With Angularjs and ASP.NET MVC

Bu yazıda TCMB (Türkiye Cumhuriyeti Merkez Bankası) tarafından yayınlanan ve kur bilgilerini içeren XML dosyasını kullanarak döviz kurlarını gösteren bir uygulama geliştireceğiz. Bu uygulama içinde gerekli TCMB verileri sunucu üzerinde çekilip AJAX ile tarayıcıya gönderilecektir. Neden direk tarayıcı üzerinden verileri çekmiyoruz diyen arkadaşlar varsa eğer öncelikle "same-origin policy" adı verilen kuralı incelemeleri gerekir. Bu kurala göre bir tarayıcı üzerinden değişik bir kaynaktaki (domaindeki) veriye ulaşım güvenlik endişesiyle engellenmektedir. Bu durum sadece AJAX için değil "iframe" için de geçerlidir.

Öncelikle TCMB kaynağından veriyi alacak sunucu kodunu tanımlayalım:

[HttpGet]
public ActionResult GetData()
{
     XDocument doc = XDocument.Load("http://www.tcmb.gov.tr/kurlar/today.xml");
     var dox = doc.Descendants()
         .Where(r => r.Name == "Currency")
         .Select(r => new {
             Isim = r.Element("Isim").Value,
             Kod = r.Attribute("Kod").Value,
             AlisKur = r.Element("BanknoteBuying").Value,
             SatisKur = r.Element("BanknoteSelling").Value
          });

      return Json(dox, JsonRequestBehavior.AllowGet);
}

Kod yukarıdan aşağıya incelendiğinde öncelikle dikkat çeken nokta [HttpGet] tanımlamasıdır. Bu tanımlama ile "GetData" fonksiyonuna ulaşılırken "Get" isteği kullanılması gerektiği belirtilmektedir. Yani fonksiyon "Post" veya "Delete" isteklerine cevap vermeyecektir.

Bir diğer önemli nokta ise "XDocument" sınıfıdır. Bu sınıf, XML verisini üzerinde LINQ sorgularının çalıştırılmasına olanak sağlayacak bir biçimde kullanmaktadır. Bilindiği üzere aynı işlemi yapan bir diğer sınıf da "XmlDocument" sınıfıdır. Bu sınıf XML verisini eski usül XML DOM olarak kullanmakta ve veri içindeki aramaları "XPath" ile yapmaktadır. LINQ arayüzünün daha basit olması sebebiyle bu uygulamada "XDocument" sınıfını kullandım.

Son aşamada "Json" fonksiyonu kullanılarak bir önceki LINQ işleminden dönen ön tanımsız nesneler JSON formatına dönüştürülüp istemciye gönderilmektedir. "JsonRequestBehavior.AllowGet" kullanılarak fonksiyonun "GET" isteklerine müsaade etmesi sağlanmıştır. Aksi durumda dönüşümü yapmayacaktır.

Sonraki aşamada AngularJs kodlarını tanımlayalım:

var currencyapp = angular.module('currencyapp', []);

currencyapp.controller('currencyListController', ['$scope', '$http',

  function ($scope, $http) {

      $http.get('./Home/GetData').success(function (data) {
          $scope.kurs = data;
      });

  }]);

Yukarıdaki kodlarda öncelikle "root scope" yani genel tanımlama amacıyla "currencyapp" modülü tanımlanmaktadır. Bu modülün altında "currencyListController" adında "$scope" ve "$http" servislerine bağımlı bir kontrolcü tanımlanmaktadır. Bu nesne aracılığıyla AJAX sorgusu gerçekleştirilmekte ve döviz verisi kapsam (scope) içine alınmaktadır. AJAX işlemi için "$http" servisinin "get()" fonksiyonu kullanılmaktadır.

AngularJs ile veri modeli oluşturduktan sonra son olarak bunu görüntü (View) ile ilişkilendirelim:

<div ng-app="currencyapp">
    <table ng-controller="currencyListController" class="table table-striped table-condensed">

        <thead>
            <tr>
                <th>Döviz Adı</th>
                <th>Döviz Kodu</th>
                <th>Alış</th>
                <th>Satış</th>
            </tr>
        </thead>
        <tbody>
            <tr ng-repeat="kur in kurs">
                <td>{{kur.Isim}}</td>
                <td>{{kur.Kod}}</td>
                <td>{{kur.AlisKur}}</td>
                <td>{{kur.SatisKur}}</td>
            </tr>
    </table>
</div>

Burada "ng-app" niteliği ile ilgili DOM nesnesinin altında yer alan ögelerin "currencyapp" uygulamasına dahil olduğu belirtilmektedir. "Table" nesnesi "ng-controller" niteliği ile "currencyListController" kontrolcüsü ile ilişkilendirilmektedir. Bu kontrolcünün kapsamı dahilinde yer alan "kurs" listesinin içindeki "kur" JSON nesneleri kullanılarak tablo oluşturulmaktadır. "{{kur.Isim}}" tanımlaması ile kur nesnesinin "Isim" değeri ilgili tablo kısmına yazılmaktadır. "tr" etiketinde "ng-repeat" niteliği kullanılarak ilgili listedeki tüm nesneler için tablo satırlarının oluşturulması sağlanmaktadır. Yani listede yer alan her bir nesne için bir tablo satırı oluşturulmaktadır.

Uygulama sonunda aşağıda gösterilen tablo elde edilmektedir: