Özgür Özvarış

Bir yazılımcının kırık dökük dünyası

c# mvc ajax post - 1

clock Eylül 28, 2017 11:07 by author OzgurOzvaris

Merhaba Arkadaşlar,

c# mvc mimarinin en önemli esnekliklerinden biriside sayfayı parçalı olarak yükleyebilmenizdir. Ancak mevcut mvc yapısı çok yalın yalın bir frame work ile geldiği için partial viewların sayfanıza yerleşebilmesi yada kaydet, sil, ara gibi işlemlerin ajax ile iletilip dönen mesajların gösterilmesi gibi işlemler için kendinize ait bir javascript framework oluşturmanız gerekiyor.

Bu gün size kendi oluşturduğum frameworkten controller metodlarını çağırırken kullandığım ajaz yöntemlerden bahsedeceğim. Ne yazıkkı çalışmamız tam bir eğitim olmadığı ve temelden tepeye doğru yükselmediği için biraz tepeden dalma olacak. Ama anlamaya çalışırsanız sizede faydalı olacağını düşünüyorum.

1. Controller metodu ajax ile çağırma senaryosu ayrı ayrı value parametrelerle ile çağırmak

//View javascript:  

var data = { param1: val1, param2: val2, param3: val3}

ajaxMethod(url, data);

//c# controller:
public ActionResult Controllermethod(int param1, int param2, int param3)

2. Controller metodu ajax ile çağırma senaryosu metodu class array parametresi ile çağırmak 

//View javascript: 

var classParameter= new Array();

classParameter.push({ param1: val1, param2: val2, paramn: valn });
...
classParameter.push({ param1: val1, param2: val2, paramn: valn });

ajaxMethod(url, $.postify(classParameter, "classParameter")) 

//c# controller: 

public IEnumerable<ClassType> classParameter

public ActionResult ControllerMetod(IEnumerable<ClassType> classParameter)

 3. Controller metodu ajax ile çağırma senaryosu - metodu serilized form input html elemets class parametresi ile çağırmak 

Burada kullanılan postify metodu serialize edilmiş dizinin sonuna yeni bir class eklemenizi sağlıyor.

Kaynak : Posting Array and Form Data to Controller - MVC Ajax

//View Javascript

var frm = $("#Form1 :input");

var ExtraData = {

    param1: val1,

    param2: val2,

    param2: val3,

}

var data= frm.serializeObject($.postify(ExtraData, "ExtraData"));

ajaxMethod(url, data);

//c# controller

public class FormData
    {
        public int? inputElement1{ get; set; }
        public string inputElement2{ get; set; }
        public string inputElement3{ get; set; }
        ...
        public DateTime? inputElement4 { get; set; }
        public bool? inputElement5 { get; set; }
        public int? inputElement6 { get; set; }


        public ExtraData ExtraData { get; set; }
    }


    public class ExtraData
    {
        public bool param1 { get; set; }
        public string param2 { get; set; }
        ...
        public ICollection<ClassType> param3{ get; set; }
    }

public ActionResult ControllerMetod(FormData classParameter)

4. Controller metodu ajax ile çağırma senaryosu - ajax dataya direk ilaveler yapmak

Daha sonradan serilized edilmiş form datasının bir dizi olduğunu düşünerek postify kullanmadan direk olarak diziye eleman ekleyerek yeni propertiler oluşturdum.

Not : Bu şekilde tekil int,string vs gibi değerleri ekleyebilirsiniz.

//View Javascript

var frm = $("#Form1 :input");

var $data = frm.serializeObject();

$data ['Param1'] = val1;
$data ['Param2'] = val3;


ajaxMethod(url, $data);

//c# controller

public class FormData
    {
        public int? inputElement1{ get; set; }
        public string inputElement2{ get; set; }
        public string inputElement3{ get; set; }
        ...
        public DateTime? inputElement4 { get; set; }
        public bool? inputElement5 { get; set; }
        public int? inputElement6 { get; set; }


        public string Param1{ get; set; }
        public int Param2{ get; set; }

    }

public ActionResult ControllerMetod(FormData classParameter)

İyi çalışmalar.

 

 



Json Dictionary Arrays Deserialize

clock Ağustos 8, 2017 17:25 by author OzgurOzvaris

Merhaba ,

Kaynak : 

https://stackoverflow.com/questions/1207731/how-can-i-deserialize-json-to-a-simple-dictionarystring-string-in-asp-net 

https://www.w3schools.com/js/js_json_arrays.asp 

http://www.newtonsoft.com/json/help/html/SerializingCollections.htm 

Eğer json diziniz bir class şeklinde değilde şimdi paylaşacağım şekilde dinamik olarak oluşan bir ekrandaki nesneleri toplayarak post edeceği değeri oluşturan bir text,value şeklindeki dictionaryden oluşsaydı nasıl olacaktı ve biz bunu nasıl deserialize edecektik.

{ "key1": "value1", "key2": "value2"}

Öncelikle biraz json dizilerinden bahsetmek isityorum.

[ "Ford", "BMW", "Fiat" ]

Bu bir string array. Tek boyutlu stringlerin içine n tane konulabileceği bir array

{
"name":"John",
"age":30,
"cars":[ "Ford", "BMW", "Fiat" ]
}

Bu da name,age, cars isimli üç property si olan bir class. Burada cars yukarıda ki örnekte görüldüğü üzere bir string array. Dizi "[]" içinde olmasına karşın, class "{}" küme parantezi içerisinde tanımlanıyor.

Fakat başta bahsettiğim gibi dictionary yapısı biraz daha sadece ve farklı bir notasyona sahip önce json notasyonun dictionary şeklinde doğru kurgulanması gerekiyor.

Daha sonra burada uyguladığım deserilizasyon işleminde http://www.newtonsoft.com kütüphanesini yöntemini kullandım gayette başarılı bir şekilde çevirdi..

Kullandığım kod satırı

string json = @"{""key1"":""value1"",""key2"":""value2""}";

Dictionary<string, string> values = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);

 

Herkese iyi çalışmalar.



c# ajax json post

clock Ocak 7, 2017 18:00 by author OzgurOzvaris

Merhaba,

Kaynak : How do I build a JSON object to send to an AJAX WebService

Eğer bir c# mvc metodunu json data göndermek isterseniz aşağıda paylaştığım örmek faydalı olacaktır.

public Response ValidateAddress(Request request1, Request myRequest2)
data: {request1:$.toJSON(myData1), myRequest2:$.toJSON(myData2)}

Yada

data: {request1:JSON.stringify(myData1), myRequest2:JSON.stringify(myData2)}

İyi çalışmalar.

 



Google chrome browser faydalı/useful add on lar

clock Mart 2, 2016 12:10 by author OzgurOzvaris

Merhaba Arkadaşlar,

Bu gün sizlerle soap ve json view da ta kullandığım bir kaç tool'u paylaşacağım.

1 - Wizdler : erişmek istediğiniz ve test etmek istediğiniz web servis metodları için web servisin wsdl dökümanını çağırıyorsuz. Örneğin : http://xxx.asmx?wsdl diyorsuzu ve adres barın sağ tarafında heme iconu beliriyor tıkladığınızda bu wsdl içindeki metodları listeliyor ve seçtiğiniz metod ile ilgili bir template soap xml üretiyor. İsterseniz bu template xml'in içinde veri girerek test edebileceğiniz gibi isterseniz hazır soap xml'iniz buraya kopyalayıp kullanabilirsiniz. Sonra go buttonuna basmanız yeterli soap cümlenizin cevabı response tabına dolacaktır.

Not : bazen soap xml lerinizin yazılması birbirine girmiş olabilir bunu temizleme işlemine internette xml cleaner deniyor. Size bu temizleme işlemi için  http://www.freeformatter.com/'ı tavsiye edebilirim. Bu sitede arar ara ihtiyaç olan xml decode encode işlemi yapan http://www.freeformatter.com/xml-escape.html paylaştığım linkide kullanabilirsiniz. 

2 - ModHeader : Bazen karşı tarafa göndermek istediğiniz soapların header'ına bazı özel taglar yamak isteyebilirizsiniz. Örneğin sıkıştırılmış olarak cevabımı ver gibi. Bu durumda ModHeader sizin requestlerinize header eklemenize yardımcı olacaktır.

3 - JSONView : internet üzerinde json veri dönen bir web servisin json'unu hiyerarşik olarak görmenizi sağlar

4 - Save my Tabs : bu addon teknik amaçlı değil ama faydalı bulduğum için yazıyorum. Mevcut Tablarınızı düzgün olarak kayıt etmenizi sağlıyor.

 

Herkese İyi çalışmalar.



Dynamic type ile json deserialize etme

clock Aralık 23, 2015 10:39 by author OzgurOzvaris

Merhaba,

Bazen size gelen json data bir servis sağlayıcıdan geliyorsa tamamını deserialize etmek nerede ise imkansız olur. Böyle bir durumda dynamic type'ini kullanarak ihtiyacınız olan veriye daha kolay ulaşabilirsiniz.

 dynamic dd = JsonConvert.DeserializeObject(txtResponseData.Text); 

 clsWeather_Forcast09_Result Weather_Forcast09_Result = new clsWeather_Forcast09_Result(); 

 Weather_Forcast09_Result.Weather_Forcast = new List<clsWeather_Forcast09_Result.clsWeather_Forcast>();  

 clsWeather_Forcast09_Result.clsWeather_Forcast   Weather_Forcast = new clsWeather_Forcast09_Result.clsWeather_Forcast(); 

 foreach (dynamic forecastday in dd.forecast.simpleforecast.forecastday) 

 { 

     Weather_Forcast = new clsWeather_Forcast09_Result.clsWeather_Forcast(); 

     Weather_Forcast.ForcastDate = forecastday.date.day.ToString() + "/" + forecastday.date.month.ToString() + "/" + forecastday.date.year.ToString(); 

     Weather_Forcast.highCelsius = decimal.Parse(forecastday.high.celsius.ToString()); 

     Weather_Forcast.lowCelsius = decimal.Parse(forecastday.low.celsius.ToString()); 

     Weather_Forcast.highFahrenheit = decimal.Parse(forecastday.high.fahrenheit.ToString()); 

     Weather_Forcast.lowFahrenheit = decimal.Parse(forecastday.low.fahrenheit.ToString()); 

     Weather_Forcast09_Result.Weather_Forcast.Add(Weather_Forcast); 

 }

Bu yöntem c# ta tamamen ihtiyaç çözüyor. Ancak vb.net te yine tökezlerseniz. şu yöntemi kullanabilirsiniz.Kaynak için http://stackoverflow.com/questions/20079177/deserializing-json-in-visual-basic bakabilirsiniz. Aşağıdaki kod bloğu size biraz uzun gelebilir. Parça paça dynamic vb typlerı ile ulaşmak istediğim noda ulaşıyorum. daha sonra bir dizi şeklindeki node dan for loop ile dönerek istediğim değerleri topluyorum. Çalışan bir koddur kendim kullandım.

Dim tempforecast = New With {Key .forecast = New Object} 

Dim sFile As String = SimpleTools.RWFile.ReadFile("c:\\testjson\\test.json") 

Dim root = JsonConvert.DeserializeAnonymousType(sFile, tempforecast) 

Dim tempsimpleforecast = New With {Key .simpleforecast = New Object} 

Dim forecast = JsonConvert.DeserializeAnonymousType(root.forecast.ToString(), tempsimpleforecast) 

Dim templstforecastday = New With {Key .forecastday = New Object} 

Dim simpleforecast = JsonConvert.DeserializeAnonymousType(forecast.simpleforecast.ToString(), templstforecastday) 

Dim lstforecastday = simpleforecast.forecastday 

'Dim com As String = post.com 

Dim Weather_Forcast09_Result As New clsWeather_Forcast_09.clsWeather_Forcast09_Result 

Dim Weather_Forcast As New clsWeather_Forcast_09.clsWeather_Forcast09_Result.clsWeather_Forcast 

'DirectCast(DirectCast(dd.forecast,Object).simpleforecast,Object).forecastday 

'For Each forecastday In dd.forecast.simpleforecast.forecastday 

For Each jforecastday In lstforecastday 

    Weather_Forcast = New clsWeather_Forcast_09.clsWeather_Forcast09_Result.clsWeather_Forcast() 

    'Dim tempforecastday = New With {Key .jforecastday = New Object} 

    'Dim forecastday = JsonConvert.DeserializeAnonymousType(jforecastday.ToString(), tempforecastday) 

    Dim tempDate = New With {Key .date = New Object, .high = New Object, .low = New Object} 

    Dim forecastday = JsonConvert.DeserializeAnonymousType(jforecastday.ToString(), tempDate) 

    Dim tempDateDetail = New With {Key .day = "", .month = "", .year = ""} 

    Dim fcDateDetail = JsonConvert.DeserializeAnonymousType(forecastday.date.ToString(), tempDateDetail) 

    Weather_Forcast.ForcastDate = fcDateDetail.day.ToString() + "/" + fcDateDetail.month.ToString() + "/" + fcDateDetail.year.ToString() 

    Dim temphighDetail = New With {Key .celsius = "", .fahrenheit = ""} 

    Dim highDetail = JsonConvert.DeserializeAnonymousType(forecastday.high.ToString(), temphighDetail) 

    Dim templowDetail = New With {Key .celsius = "", .fahrenheit = ""} 

    Dim lowDetail = JsonConvert.DeserializeAnonymousType(forecastday.low.ToString(), templowDetail) 

    Weather_Forcast.highCelsius = Decimal.Parse(highDetail.celsius.ToString()) 

    Weather_Forcast.lowCelsius = Decimal.Parse(lowDetail.celsius.ToString()) 

    Weather_Forcast.highFahrenheit = Decimal.Parse(lowDetail.fahrenheit.ToString()) 

    Weather_Forcast.lowFahrenheit = Decimal.Parse(lowDetail.fahrenheit.ToString()) 

    Weather_Forcast09_Result.Add(Weather_Forcast) 

Next 

oWeather_Forcast_09.Weather_Forcast09_Result = Weather_Forcast09_Result

İyi çalışmalar.

 



MVC Excel Export - 2

clock Şubat 18, 2013 10:33 by author OzgurOzvaris

Değerli Arkadaşlar,

Bir önceki yazımızda SpreadsheetModel view oluşturarak excelimizi nasıl form submit işlemi sonucunda mvc üzerinden export edebileceğimizi öğrendik. Bu yazımızda ise eğer formumuzu submit etmek yerine sadece ajax mantığı ile sayfanın sadece ihtiyacımız olan datasını gönderip excel downlad nasıl yapacağımızı öğreneceğiz.

Internete baktığınız zaman ajax.post yöntemi ile gönderilen datalar sonucunda clienta gönderilen excel dosyalarının downlad edilemediğini göreceksiniz. Buna karşılık alternatif olarak kullanılan bir yöntemi çok beğendim sizlerle paylaşmak istedim.

Tabi önce kaynaklar,

http://stackoverflow.com/questions/2186562/post-to-server-receive-pdf-deliver-to-user-w-jquery

http://stackoverflow.com/questions/5742243/submitting-a-form-with-json-data-in-jquery

http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

ve tabiki Kendi harmanlanmış projem

MVCExcelExport.zip (2,36 mb)

Model

public class SpreadsheetModel
    {
        public String fileName { get; set; }
        public String[,] contents { get; set; }
    }
public class PersonSearchModel
    {
        public string FileName { get; set; }

        public string Field1 { get; set; }

        public DateTime Field2 { get; set; }

        public PersonSearchChieldClass ChieldClass { get; set; }
    }

    public class PersonSearchChieldClass
    {
        public string Field1 { get; set; }

        public int Field2 { get; set; }
    }

Controller

public ActionResult Index(string Cell1, string Cell2)
        {

            SpreadsheetModel mySpreadsheet = new SpreadsheetModel();
            mySpreadsheet.contents = new String[3, 2] 
                { 
                    {Cell1,Cell2}, 
                    {"Cell21","Cell22"},
                    {"Celsdfsdl31","Csdfsdell3"} 
                };

            mySpreadsheet.contents[2, 1] = "test";

            mySpreadsheet.fileName = "test.xls";
            return View(mySpreadsheet);

        }
public ActionResult Index2(string filename, string format, string content)
        {
            string[] ContentData = content.Split(';');

            SpreadsheetModel mySpreadsheet = new SpreadsheetModel();
            mySpreadsheet.contents = new String[3, 2] 
                { 
                    {ContentData[0],ContentData[1]}, 
                    {"Cell21","Cell22"},
                    {"Celsdfsdl31","Csdfsdell3"} 
                };

            mySpreadsheet.contents[2, 1] = "test";

            mySpreadsheet.fileName = filename +".xls";
            return View("Index", mySpreadsheet);

        }
public ActionResult Index3(string Paramaters)
        {
            System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();

            PersonSearchModel PersonSearchModel_ = new PersonSearchModel();

            PersonSearchModel_ = serializer.Deserialize<PersonSearchModel>(Paramaters);




            SpreadsheetModel mySpreadsheet = new SpreadsheetModel();
            mySpreadsheet.contents = new String[3, 2] 
                { 
                    {PersonSearchModel_.Field1,PersonSearchModel_.Field2.ToShortDateString()}, 
                    {PersonSearchModel_.ChieldClass.Field1,PersonSearchModel_.ChieldClass.Field2.ToString()},
                    {"Celsdfsdl31","Csdfsdell3"} 
                };

            mySpreadsheet.contents[2, 1] = "test";

            mySpreadsheet.fileName = PersonSearchModel_.FileName + ".xls";
            return View("Index", mySpreadsheet);

        }

View

jQuery.download = function (url, data, method) {
        //url and data options required
        if (url && data) {
            //data can be string of parameters or array/object
            data = typeof data == 'string' ? data : jQuery.param(data);
            //split params into form inputs
            var inputs = '';
            jQuery.each(data.split('&'), function () {
                var pair = this.split('=');
                inputs += '<input type="hidden" name="' + pair[0] + '" value="' + pair[1] + '" />';
            });
            //send request
            jQuery('<form action="' + url + '" method="' + (method || 'post') + '">' + inputs + '</form>')
		.appendTo('body').submit().remove();
        };
    };

    jQuery.downloadJson = function (url, data, method) {
        //url and data options required
        if (url && data) {
            //send request
            var formTagStr = '<form id="DocPost" action="' + url + '" method="' + (method || 'post') + '"> <input type="hidden" name="Paramaters" id="Paramaters"  /> </form>';

            jQuery(formTagStr).appendTo('body');

            //alert(data);

            $("#DocPost #Paramaters").val(data);

            $("#DocPost").submit().remove();
        };
    };
function test() {
        var ContentData = "5;test";

        ExcelExportAjaxPost('/ExcelExport/Index2', 'filename=mySpreadsheet&format=xls&content=' + ContentData);
    }

    function test2() {

        var PersonSearchChieldClass =
        {
            Field1: "Chield",

            Field2: 15 
        }

        var PersonSearchModel = {

            FileName : "test",

            Field1: "Master",

            Field2:"18.02.2013",

            ChieldClass: PersonSearchChieldClass
        }

        ExcelExportAjaxPost2('/ExcelExport/Index3', JSON.stringify(PersonSearchModel));


    }

    function ExcelExportAjaxPost(path, data) {

        $.download(path, data);
    }

    function ExcelExportAjaxPost2(path, data) {

        $.downloadJson(path, data);
    }
<h2>@ViewBag.Message</h2>
<p>
    Excel Export Yöntemleri
</p>

<a href="./ExcelExport?Cell1=aaa&Cell2=111"> Normal Excel çıktı Al</a>
<br />
<br />
<a  href="#" onclick="test()"> Ajax Excel çıktı Al (form data)</a>
<br />
<br />
<a  href="#" onclick="test2()"> Ajax Excel çıktı Al (json data)</a>

Burada bir inceliği belirtmem lazım. "downloadJson" javascript metoduna dikkat ederseniz dinamik olarak oluşturulan formun içinde json datayı taşıyan hidden parameters html elementinin value değerinin içine string olarak değeri yazmak yerine  $("#DocPost #Paramaters").val(data); şeklinde value değerini set ettiğimi göreceksiniz. Sebebi Gidip gelen data string olduğu için alt classlar için " ' " değeri kullanılıyor ancak direk value ya set ederseni bu tırnaklar çakışmaya neden oluyor.

Herkese iyi çalışmalar dilerim.

 

 



Json Serializer

clock Ocak 2, 2013 08:56 by author OzgurOzvaris

Değerli arkadaşlar,

Yeni web dünyasında artık olmazsa olmaz konulardan biri jquery diğeride json data paketleri gibi gözüküyor. Bu günki örneğimizde client tarafına yüklenmiş bir dropdown listin nasıl tekrar server'a postback olmadan başka bir doropdown list tarafından master detail ilişki ile yönetildiğini göreceğiz.

Hemen bir kaç kaynak linki verelim.

JSON Serialization and Deserialization in ASP.NET

Adding options to a select using Jquery/javascript

What's the best way to query an array in javascript to get just the items from it I want?

Using core jQuery, how do you remove all the options of a select box, then add one option and select it?

Gördüğünüz gibi basit uygulamalarda bile ne kadar çok yardıma ihtiyaç duyuyoruz. Varın siz bir de bir projenin kaç kırıntı ve köklü bilgi parçasından meydan geldiğini hesap edin. Her neyse.

JsonSerializer.zip (175,35 kb)

 



Hakkımızda  AboneOl 

Blog Yayınımıza Hoşgeldiniz.

Month List

RecentPosts

Sign In