Çözüldü ASP.net MVC AJAX ile birden fazla result göndermek mümkün mü?

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

Sinan Uğurlu

Kilopat
Katılım
30 Mayıs 2018
Mesajlar
504
Çözümler
12
Yer
Datacenter
Daha fazla  
Cinsiyet
Erkek
Meslek
Yazılım ve Ağ Altyapı Danış.
ASP.NET MVC kullanarak silme, düzenleme gibi işlemleri AJAX kullanarak gerçekleştiriyorum. Düzenle komutunu gerçekleştirdiğimde Controller tarafında kullanıcı yetkilerini 2.kez kontrol ediyorum, bazı sorgular gerçekleştiriyorum. Burada eğer bu sorgular olumsuzsa "success = false" komutu ile hata veriyorum. Ancak bunu gerçekleştirdiğimde eğer komut başarılı ise success = true komutunun yanında verileri gönderemiyorum. Aşağıda kaynak kodları mevcut, yardımcı olursanız sevinirim.

Not; Henüz kendimi geliştiriyorum, MVC'de daha kolay bir yöntemle sayfayı yenilemeden daha profesyonelce yapabilir miyim?

Controller Tarafı;
ASP.net:
[HttpPost]
        public JsonResult urunDuzenle(FormCollection formCollection)
        {
            kullaniciSorgu();
            if (roleUrunDuzenle == true)
            {
                int id = Convert.ToInt32(formCollection["id"]);
                var data = db.tblUrunler.Where(u => u.id == id).FirstOrDefault();
                if (data != null)
                {
                    return Json (data, JsonRequestBehavior.AllowGet);
                }
                else
                {
                    return Json(new { success = false, hataMesaji = "Ürün ID'sini kontrol ediniz, kayıt bulunamadı. Sorun devam ederse sayfayı yenileyiniz." }, JsonRequestBehavior.DenyGet);
                }
            }
            else
            {
                return Json(new { success = false, hataMesaji = "Ürün düzenlemek için yetkiniz bulunmamaktadır." }, JsonRequestBehavior.DenyGet);
            }
        }

AJAX;
Kod:
function urunDuzenleModal(id) {
    $('#urunModal').load('/Stok/urunDuzenlePartial');
    try {
        $.ajax({
            url: '/Stok/urunDuzenle',
            type: 'POST',
            data: { id: id },
            datatype: 'json',
            success: function (data) {
                if (data.success) {
                    $("#duzenleID").val(data.id);
                    $('#duzenleUrunBirim').val(data.malzemeBirim).change();
                    $("#duzenleUrunAdi").val(data.malzemeAdi);
                    $("#duzenleUrunTanim").val(data.malzemeTanim);
                    $("#duzenleUrunKodu").val(data.malzemeKod);
                    $("#duzenleUrunTur").val(data.malzemeTur);
                    $("#duzenleUrunStokSayisi").val(data.malzemeStok);
                }
                else {
                    alert(data.hataMesaji);
                }
            }
        })
    }
    catch (e) {
        alert(e.message);
    }
}
 
Çözüm
Var olan kod üzerinde önerim:
Öncelikle dönüş objeni statik hale getirmelisin. Modellerini tuttuğun yer neresi ise orada (kullandığın design pattern e göre değişir) ProductModel diye bir model oluştur, içerisinde JS tarafında set etmeye çalıştığın proplar olsun.

C# tarafında dönüş tipin bu obje olsun. Data!= null if statement ı içinde bir obje yarat. Sonra data değişkeni ile gelen verileri içerisine ekle. Ajax tarafında hasValue kontrolü yaparak atamalarını yapman yeterli.

Error kontrolünü ise HTTP kodları ile yapabilirsin. Eğer controllerda gelen data null ise return StatusCode(404) vs yapabilirsin, hata kodu duruma göre değişir tabii.

---------------------------------------------------------------------

Gelelim işin doğrularına yanlışlarına.

Ajax tarafı için bir şey diyemem, tercih meselesidir, kullanımında ciddi bir sıkıntı yok.

c# tarafında ise:
Öncelikle JsonResult dönmek doğru değil. Statik bir model kullanman daha error handler olur. Aşağıda verdiğim örnekteki gibi bir modelin olmalı. Buna ek olarak bir ErrorHandler yapın olmalı. İnternetten araştırabilirsin. Gerektiğinde http hata kodları döndürmene yarar. Yetki kontrolünü senin yazdığın şekilde değil, token üzerinden yapmalısın ve güvenli bir api call için token kullanmalısın. Tabii bunun için de bir identity sistemin olmalı. Olması durumunda [Authorize] takısı ile token kontrolü ekleyebilirsin. Tabii bu durumda da çağrılarda geçerli token olup olmadığını anlamanı sağlayacak bir AuthorizationProvider yapın olmalı. Bu da ekstra geliştirme. Gerekli ayarlamaları Startup ta yapmalısın. Sonrasında önerim Controller larını bir BaseController dan türetmen. BaseController içerisinde de gelen tokena göre AuthenticatedUser diye bir değişkene token ataması yaparsın. BaseController ile türettiğin her controller class ında otomatik olarak token hazır olur. Tüm endpointlerinde [Authorize] takısı ile kullanabilirsin rahatça.
Bunun haricinde db işlemlerini doğrudan da yapabilirsin tabii ki ama bunun için de bir base service yazman ve dependency injection ile controller classların içerisinde kullanman daha doğru olur. Mümkün oldukça async yapı kullanmaya çalışmanı öneririm.

Tüm bunları anlatmamın sebebi sorunun sonunda "acemi" olduğunu söylemen. Araştırıp öğrenecek, kendini geliştirecek bir sürü keyword vermiş oldum aslında. Bunları öğrenerek best practice lere uygun randımanlı apiler yazabilirsin.
(Dil bağımsız olarak bilmen gerekenlerden en önemlisi dependency injection mantığı ve doğru kullanımı.)


Örnek Model:
C#:
public class ProductModel{
    public Guid Id { get; set; }
    public string Name { get; set; }
}



Örnek Controller:
C#:
[HttpPost]
[Authorize]
[ProducesResponseType(typeof(ProductModel), 200)]
[ProducesResponseType(typeof(ApiResponse), 500)]
[ProducesResponseType(typeof(ApiResponse), 400)]
[ProducesResponseType(401)]
public async Task<ProductModel> EditProduct(FormCollection formCollection)
{
    if(!TokenScope.Include(x => x.scope = "role_edit"))
        return await Error("Access denied!");
  
    try
    {
        int id = Convert.ToInt32(formCollection["id"]);
        var data = await db.tblUrunler.Where(u => u.id == id).FirstOrDefault();
        if (data != null)
        {
            var model = new ProductModel({
                model.Id = data.id,
                model.Name = data.name
            });
            return model;
        }
      
        return NotFound()
    }
    catch (Exception e)
    {
        return await Error(e.Message);
    }
}
Var olan kod üzerinde önerim:
Öncelikle dönüş objeni statik hale getirmelisin. Modellerini tuttuğun yer neresi ise orada (kullandığın design pattern e göre değişir) ProductModel diye bir model oluştur, içerisinde JS tarafında set etmeye çalıştığın proplar olsun.

C# tarafında dönüş tipin bu obje olsun. Data!= null if statement ı içinde bir obje yarat. Sonra data değişkeni ile gelen verileri içerisine ekle. Ajax tarafında hasValue kontrolü yaparak atamalarını yapman yeterli.

Error kontrolünü ise HTTP kodları ile yapabilirsin. Eğer controllerda gelen data null ise return StatusCode(404) vs yapabilirsin, hata kodu duruma göre değişir tabii.

---------------------------------------------------------------------

Gelelim işin doğrularına yanlışlarına.

Ajax tarafı için bir şey diyemem, tercih meselesidir, kullanımında ciddi bir sıkıntı yok.

c# tarafında ise:
Öncelikle JsonResult dönmek doğru değil. Statik bir model kullanman daha error handler olur. Aşağıda verdiğim örnekteki gibi bir modelin olmalı. Buna ek olarak bir ErrorHandler yapın olmalı. İnternetten araştırabilirsin. Gerektiğinde http hata kodları döndürmene yarar. Yetki kontrolünü senin yazdığın şekilde değil, token üzerinden yapmalısın ve güvenli bir api call için token kullanmalısın. Tabii bunun için de bir identity sistemin olmalı. Olması durumunda [Authorize] takısı ile token kontrolü ekleyebilirsin. Tabii bu durumda da çağrılarda geçerli token olup olmadığını anlamanı sağlayacak bir AuthorizationProvider yapın olmalı. Bu da ekstra geliştirme. Gerekli ayarlamaları Startup ta yapmalısın. Sonrasında önerim Controller larını bir BaseController dan türetmen. BaseController içerisinde de gelen tokena göre AuthenticatedUser diye bir değişkene token ataması yaparsın. BaseController ile türettiğin her controller class ında otomatik olarak token hazır olur. Tüm endpointlerinde [Authorize] takısı ile kullanabilirsin rahatça.
Bunun haricinde db işlemlerini doğrudan da yapabilirsin tabii ki ama bunun için de bir base service yazman ve dependency injection ile controller classların içerisinde kullanman daha doğru olur. Mümkün oldukça async yapı kullanmaya çalışmanı öneririm.

Tüm bunları anlatmamın sebebi sorunun sonunda "acemi" olduğunu söylemen. Araştırıp öğrenecek, kendini geliştirecek bir sürü keyword vermiş oldum aslında. Bunları öğrenerek best practice lere uygun randımanlı apiler yazabilirsin.
(Dil bağımsız olarak bilmen gerekenlerden en önemlisi dependency injection mantığı ve doğru kullanımı.)


Örnek Model:
C#:
public class ProductModel{
    public Guid Id { get; set; }
    public string Name { get; set; }
}



Örnek Controller:
C#:
[HttpPost]
[Authorize]
[ProducesResponseType(typeof(ProductModel), 200)]
[ProducesResponseType(typeof(ApiResponse), 500)]
[ProducesResponseType(typeof(ApiResponse), 400)]
[ProducesResponseType(401)]
public async Task<ProductModel> EditProduct(FormCollection formCollection)
{
    if(!TokenScope.Include(x => x.scope = "role_edit"))
        return await Error("Access denied!");
  
    try
    {
        int id = Convert.ToInt32(formCollection["id"]);
        var data = await db.tblUrunler.Where(u => u.id == id).FirstOrDefault();
        if (data != null)
        {
            var model = new ProductModel({
                model.Id = data.id,
                model.Name = data.name
            });
            return model;
        }
      
        return NotFound()
    }
    catch (Exception e)
    {
        return await Error(e.Message);
    }
}
 
Son düzenleme:
Çözüm
Var olan kod üzerinde önerim:
Öncelikle dönüş objeni statik hale getirmelisin. Modellerini tuttuğun yer neresi ise orada (kullandığın design pattern e göre değişir) ProductModel diye bir model oluştur, içerisinde JS tarafında set etmeye çalıştığın proplar olsun.

C# tarafında dönüş tipin bu obje olsun. Data!= null if statement ı içinde bir obje yarat. Sonra data değişkeni ile gelen verileri içerisine ekle. Ajax tarafında hasValue kontrolü yaparak atamalarını yapman yeterli.

Error kontrolünü ise HTTP kodları ile yapabilirsin. Eğer controllerda gelen data null ise return StatusCode(404) vs yapabilirsin, hata kodu duruma göre değişir tabii.

---------------------------------------------------------------------

Gelelim işin doğrularına yanlışlarına.

Ajax tarafı için bir şey diyemem, tercih meselesidir, kullanımında ciddi bir sıkıntı yok.

c# tarafında ise:
Öncelikle JsonResult dönmek doğru değil. Statik bir model kullanman daha error handler olur. Aşağıda verdiğim örnekteki gibi bir modelin olmalı. Buna ek olarak bir ErrorHandler yapın olmalı. İnternetten araştırabilirsin. Gerektiğinde http hata kodları döndürmene yarar. Yetki kontrolünü senin yazdığın şekilde değil, token üzerinden yapmalısın ve güvenli bir api call için token kullanmalısın. Tabii bunun için de bir identity sistemin olmalı. Olması durumunda [Authorize] takısı ile token kontrolü ekleyebilirsin. Tabii bu durumda da çağrılarda geçerli token olup olmadığını anlamanı sağlayacak bir AuthorizationProvider yapın olmalı. Bu da ekstra geliştirme. Gerekli ayarlamaları Startup ta yapmalısın. Sonrasında önerim Controller larını bir BaseController dan türetmen. BaseController içerisinde de gelen tokena göre AuthenticatedUser diye bir değişkene token ataması yaparsın. BaseController ile türettiğin her controller class ında otomatik olarak token hazır olur. Tüm endpointlerinde [Authorize] takısı ile kullanabilirsin rahatça.
Bunun haricinde db işlemlerini doğrudan da yapabilirsin tabii ki ama bunun için de bir base service yazman ve dependency injection ile controller classların içerisinde kullanman daha doğru olur. Mümkün oldukça async yapı kullanmaya çalışmanı öneririm.

Tüm bunları anlatmamın sebebi sorunun sonunda "acemi" olduğunu söylemen. Araştırıp öğrenecek, kendini geliştirecek bir sürü keyword vermiş oldum aslında. Bunları öğrenerek best practice lere uygun randımanlı apiler yazabilirsin.
(Dil bağımsız olarak bilmen gerekenlerden en önemlisi dependency injection mantığı ve doğru kullanımı.)


Örnek Model:
C#:
public class ProductModel{
    public Guid Id { get; set; }
    public string Name { get; set; }
}



Örnek Controller:
C#:
[HttpPost]
[Authorize]
[ProducesResponseType(typeof(ProductModel), 200)]
[ProducesResponseType(typeof(ApiResponse), 500)]
[ProducesResponseType(typeof(ApiResponse), 400)]
[ProducesResponseType(401)]
public async Task<ProductModel> EditProduct(FormCollection formCollection)
{
    if(!TokenScope.Include(x => x.scope = "role_edit"))
        return await Error("Access denied!");
 
    try
    {
        int id = Convert.ToInt32(formCollection["id"]);
        var data = await db.tblUrunler.Where(u => u.id == id).FirstOrDefault();
        if (data != null)
        {
            var model = new ProductModel({
                model.Id = data.id,
                model.Name = data.name
            });
            return model;
        }
     
        return NotFound()
    }
    catch (Exception e)
    {
        return await Error(e.Message);
    }
}
İlk olarak bu kadar detaylı bir cevap verdiğiniz için çok teşekkür ederim. Benim için çok ama çok değerli bir cevap bu, verdiğiniz keyword'lerin hepsini araştırarak kullanmaya çalışacağım, verdiğiniz örnek kodları incelediğimde çok daha doğru olduğu bariz bir şekilde belli oluyor. Henüz yeni başladığımız için bu tarz yol gösteren usta'lara çok ihtiyacımız var. Çok teşekkür ediyorum, İyi akşamlar.
 

Technopat Haberler

Yeni konular

Geri
Yukarı