Özgür Özvarış

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

Devexpress MVC Could not load file or assembly 'Microsoft.Owin.Security.Cookies'

clock Mayıs 16, 2018 14:30 by author OzgurOzvaris

Merhaba,

Uzun bir aradır admin sayfama bir hatadan dolayı bağlanamıyordum sonunda erişebildim. Comment tadında bloglarımıza devam ediyoruz.

Kaynak : 

The "Could not load file or assembly 'Microsoft.Owin' or one of its dependencies" error occurs with a sample project that is created with DevExpress wizard

Devexpress MVC ile yeni bir uygulama visual Studio 2017 de gelişitrmeye çalıştığımda şu hatayı aldı 

 Çözümü

<dependentAssembly>
    <assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="4.0.30319" />
</dependentAssembly>

İyi çalışmalar.

 



Basit SignalR uygulaması - 2 Server to Client

clock Mart 4, 2016 17:40 by author OzgurOzvaris

Merhaba Arkadaşlar,

Geçen gün ki çalışmamızda n client'ın birbiri ile signalr ile haberleşmesini dair basit bir mvc3 uygulaması gördük

Basit SignalR uygulaması - 1 Client to Client .

Bu gün ise dışarıya açık bir webapi yazacağız ve 3. party bir uygulama be web api aracılığı ile clientlarımıza mesaj gönderecek. Biz kendi uygulamamızda santral uygulamasının web api aracılığı ile client'larımıza çalan telefona göre pencere açması için bu yöntemi kullandık. Sizlerde istediğiniz benzer amaçlar için kullanabilirsiniz.

Kaynaklar,

How to create Web API using MVC 3.0

Routing with Multiple Parameters using ASP.NET MVC

Örnek projemizin kaynak kodu SignalRSample.zip (9,18 mb) (vs 2010 mvc 3)

Öncelikle bir nuget paketi yüklemelisiniz

Install-Package Microsoft.AspNet.WebApi -Version 4.0.30506

Ardından global.asax a bir route satırı eklemek geliyor. !Beni biraz uğraştırdı. Bu route satırının diğer route satırlarının üstüne eklemenizi tavsiye ederim. Aksi taktirde çalışmayabilir. ! 

using System.Web.Http;
routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new {id = RouteParameter.Optional}
                );

Artık yazacağımız web api'ye http://sitename/api/ApiName?paramaters şeklinde erişebiliriz. 

Şimdi geçen uygulamamızda geliştirdirdiğimiz uygulamamızdaki client lara mesaj gönderen bir örnek api uygulaması yazalım.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;

namespace SignalRSample.Controllers
{
    /// <summary>
    /// http://stackoverflow.com/questions/11472920/send-signalr-message-from-server-to-all-clients
    /// http://stackoverflow.com/questions/21519911/how-to-create-web-api-using-mvc-3-0
    /// http://stackoverflow.com/questions/2246481/routing-with-multiple-parameters-using-asp-net-mvc
    /// 3. nolu global.asax route basamağını diğer routların üstüne yazmayınca çalışmadı
    /// </summary>
    public class ValuesController : ApiController
    {

        public string Get(string id, string Message)
        {
            SignalRHost.OpenPopUp(id, Message);
            return "1";
        }

    }
}

Şimdi uygulamamızı çalıştıralım.ve client id olarak 1 Set edelim

test apimizi adres bardan çağıralım.

http://localhost:50995/api/Values?id=1&message=Merhaba%20D%C3%BCnya

Eğer sorunsuz bir şekilde basamakları uyguladı iseniz. Ekranda merhaba dünya mesajını görmüş olmanız gerekiyor.

 

Örnek projemizin kaynak kodu SignalRSample.zip (9,18 mb) (vs 2010 mvc 3)

İyi çalışmalar.

 

 



Mvc de view ların ayrı dll den gelmesi

clock Eylül 30, 2015 13:33 by author OzgurOzvaris

Merhaba Arkadaşlar,

Bu seferki yazımızda mvc ile ilgili biraz derin bir konudan bahsedeceğiz. Viewların başka dll lerden çağırılması. Malum microsoft mvc projeleri biraz beklenen performansta gelişmiyor. Scoot gu nun bir sunumu ile başlayan microsoftun mvc macerası herkesin ağzının suyunu akıttıktan sonra ne yazıkki diğer birçok microsoft projesi gibi beklenen heyecanla devamı getirilmedi. Microsoftta development dünyasında ki bu genel durgunluk nereye varır bilinmez ancak biz geliştiriciler yine müşteri beklentilerini karşılamak adına çoğu zaman kendi yollarımızı açmak durumunda kalıyoruz.

Standart mvc yapısında herşey aynı proje içinde oluşturulan folderlar üzerinde yapılandırılmış durumda oysaki en basit anlamda bir projenin temel olarak DDD yani Domain Driven Design pattern ile yapılandırılmış projenin en basit anlamda UI (User Interface), BL (Bussiness Layet), DAL (Data Access Layer) katmanları ile yapılandırıldığı var sayılırsa MVC sinin bu her şeyi içine gömülü tek proje mantığı hiçte iş görmeyecektir.

 

Basit bir kaç yöntemle bu yapıyı şu yapıya çevirmek mümkün

 

 

Ancak Büyük bir projeye talipseniz ve projeniz bir çok modülden oluşuyorsa o zaman bu yapıda yeterli olmayacaktır her modülünüzün kendi için de viewlarını conrollerlarını ve bussiness layerlarını barındırması gerekecektir. Bu durumda aşağıdaki makaleler size yol gösterecektir kanaatindeyim.

Compile your asp.net mvc Razor views into a seperate dll

How to create ASP.NET MVC area as a plugin DLL?

http://maxtoroq.github.io/2012/02/aspnet-mvc-plugins.html

https://github.com/RazorGenerator/RazorGenerator

Herkese İyi çalışmalar.



.Net popüler Dependecy Injection Tools

clock Ağustos 18, 2014 18:10 by author OzgurOzvaris

Merhaba,

Son json size limit problemi ile birlikte .Net dünyasında ki popüler bir kaç dependecy injection tool'u anmak gerektiğini düşündüm.

Ninjet

http://www.ninject.org/

Unitiy

http://msdn.microsoft.com/en-us/library/ff647202.aspx

http://blogs.unity3d.com/2014/05/07/dependency-injection-and-abstractions/

https://unity.codeplex.com/

Stracture Map

http://docs.structuremap.net/

Bu da gogole biraz bakınırken gördüğüm java dünyası için güzel bir makale :)

Inversion of Control Containers and the Dependency Injection pattern

 



MVC Json size limit

clock Ağustos 18, 2014 17:40 by author OzgurOzvaris

Merhaba Arkadaşlar,

Kaynaklar :

Web.config jsonSerialization maxJsonLength ignored

ASP.Net MVC4 - Setting the Default JSON Serializer

Using JSON.net as default JSON serializer in ASP.NET MVC 3 - Is it possible?

Using StructureMap to inject Controller and Attribute Dependencies *****

Bu günkü konumuz yüksek size'lı bir json datasını client tarafında göndermeye çalıştığınızda aldığınız 500 - Internal Server Error ile ilgili. Kaynaklardan gördüğünüz gibi çözmek biraz zorladı.

Event Viewer'da Application Errorlara baktığınızda hata açık olarak şu şekilde yazılıyor

Error during serialization or deserialization using the JSON JavaScriptSerializer. 
The length of the string exceeds the value set on the maxJsonLength property

Yani sorunun JavaScriptSerializer'ın size limiti ile olduğu çok açık. Ancak bu limit'i nasıl kaldırabilceğimiz ile ilgili türlü türlü bilgilerden doğru bilgiye uğraşmak kolay olmadı. Bazıları sorunun browser limitlerinden kaynaklandığını söylemiş, bazıları web config'e ekkleyeceğini bazı taglar ve limit değerleri aşılabileceğini söylemiş vs. Bende ne yazıkki bunlardan sadece kod tarafından MaxJsonLength ile ilgili değeri set etmeliniz tavsiyesi bir ışık oldu.

Ancak jsonresult dönen bir class da bu değeri set etmek verilen örnekteki kadar kolay değil öncelikle json result'ı customize etmek gerekti. Customize ettiğim jason result'ı handle edebilmesi için controllerInvoker class'ına dependecy injection yapmak gerek ti tabi bu işler ağızdan çıktığı kadar kolay değil. Örneğin ben dependecy injection tool olarak stracture map kullanıyorum Stracturemap ile sorunsuz olarak controller classlarına default parametreler geçebiliyorum ancak bu sefer daha derinlere bir injection yapmak gerekli bunun için daha ileri bir kodlama gerekiyor.

Kaynakları inceldeğinizde ExtensibleActionInvoker ile ilgili örnek (**** eklediğim) stracture map üzerine olduğu için birebir benim sorunumu çözdü.  Sadece nuget ile  Reactive Extension (RX) tool u kurdum. Yeni versiyonlarda run komutu gitmiş yerine ForEach gelmiş onu çözmek için de

filters.ToObservable().ForEach

komutu kullanmak gerekti. Bu vesile ile daha önce projemde kullandığım ControllerFactory çok daha güzel bir yapıya kavuştu. Bu yapıda örnekte anlatıldığı üzere ihtiyaç olursa çok daha orjinal attributelar kullanabileceğim.

İyi çalışmalar.



Mvc Architectural poster

clock Şubat 5, 2014 15:20 by author OzgurOzvaris

Değerli Arkadaşlar,

Biliyorsunuz kuş bakışı önemlidir. Eğer MVC ye kuş bakışı bakmak isterseniz bu resimler faydalı olacaktır kanaatindeyim.

Kaynak

http://saulius.sunauskas.com/2013/10/14/understanding-asp-net-mvc-request-processing-pipeline-visually/

http://www.dotnet-tricks.com/Tutorial/mvc/TbR0041112-Asp.net-MVC-Request-Life-Cycle.html

asp_net_mvc_poster.zip (458.13 kb)

 

 

 



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.

 

 



MVC Excel Export

clock Şubat 7, 2013 16:56 by author OzgurOzvaris

Değerli Arkadaşlar,

Önce kaynaklar

MVC3 Razor Export To Excel

JQuery jqGrid Export to Excel Using ASP.NET MVC Framework

Kendi Projem

MVC Excel Export - 2 Yazısınıda mutlaka okuyum. Projedeki linkler o yazıyla da bütünlük arz ediyor.

Klasik aspx de hepimizin bildiği standart bir excel export yöntemi vardır. Bu yöntemi mvc de kullananlarda gördüm ancak pek içime sinmedi. 

public ActionResult ExportToExcel()
        {
            var products = _productRepository.GetAll();

            var grid = new GridView();
            grid.DataSource = from p in products
                              select new
                                         {
                                             ProductName = p.ProductName,
                                             SomeProductId = p.ProductID
                                         };
            grid.DataBind();

            Response.ClearContent();
            Response.AddHeader("content-disposition", "attachment; filename=MyExcelFile.xls");

            Response.ContentType = "application/excel";

            StringWriter sw = new StringWriter();

            HtmlTextWriter htw = new HtmlTextWriter(sw);

            grid.RenderControl(htw);

            Response.Write(sw.ToString());

            Response.End();

            return View("Index"); 
        }

Bizin kullanacağımız yöntem biraz daha farklı olacak.

Önce Model Tasarlıyoruz

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

Sonra View tasarlıyoruz.

@model MvcApplication1.Models.SpreadsheetModel 
@{ 
    Layout = null; 
    Response.ContentType = "application/vnd.ms-excel"; 
    Response.AddHeader("Content-Disposition", "attachment; filename=" + Model.fileName); 
    //Content-Disposition is defined in RFC-2183 
} 
<?xml version="1.0" encoding="utf-16"?> 
<ss:Workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"> 
    <ss:Worksheet ss:Name="Sheet1"> 
        <ss:Table> 
        @for (int i = 0; i < Model.contents.GetLength(0); ++i) 
        { 
            <ss:Row> 
            @for (int j = 0; j < Model.contents.GetLength(1); ++j) 
            { 
                <ss:Cell> 
                    <ss:Data ss:Type="String">@Model.contents[i, j]</ss:Data> 
                </ss:Cell> 
            } 
            </ss:Row> 
        } 
        </ss:Table> 
    </ss:Worksheet> 
</ss:Workbook>

 Son olarak Controller

public ActionResult Index()
        {
            SpreadsheetModel mySpreadsheet = new SpreadsheetModel();
            mySpreadsheet.contents = new String[3, 2] 
                { 
                    {"Cell11","Cell12"}, 
                    {"Cell21","Cell22"},
                    {"Celsdfsdl31","Csdfsdell3"} 
                };
            
            mySpreadsheet.contents[2,1] = "test" ;

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

        }

Bu yapı bana daha şık gözüktü. Herkese iyi çalışmalar.



Hakkımızda  AboneOl 

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

Month List

RecentPosts

Sign In