Özgür Özvarış

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

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.



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.



IIS 7 mvc problemi

clock Nisan 3, 2014 18:40 by author OzgurOzvaris

Değerli Arkadaşlar,

Daha önce bu sorunu çözmüştüm. Ancak meğerse bir sunucuda Application pool'u integrated deyince sorun çıkmıyormuş ancak classic deyince mvc olarak değilde normal aspx uygulaması gibi çalışmaya başladı.

Normal bir aspx gibi çalışmaya başladığını "403.14 - Directory listing denied." hatasından anladım. MVC uygulamalarda bir default sayfa olmadığı için eğer düzgün kurulmamış ise sizi adres bardaki satırdan bir directory'i açmaya çalışıyorsunuz sanıyor.

Sunucuda çalışan MVC uygulaması var, MVC runtime install edilmiş. Sonunda sebebi buldum ama bir günüm gitti. Sizin gitmesin diye yazıyorum.

Öncelikle başka bir sunucumda sorunsuz çalışan classic pool olan uygulamadan kıyasladım, application pool classic seçilince bu iis'de uygulamada bazı modüllerin yüklenmediğini farkettim (Features bölümünden modules'den) bu nedenle faydası oldu mu bilmiyorum ancak iis 7'e yüklenmemiş modülleride yükledim. Sorun çözülmedi.

Sonra şu harika dökümanı buldum.

http://www.asp.net/mvc/tutorials/older-versions/deployment/using-asp-net-mvc-with-different-versions-of-iis-cs

bu dökümandaki Creating a Wildcard Script Map bölümü sorunumu çözdü. Bu bölümdekileri harfiyyen yaptım ve mvc uygulamam çalışmaya başladı.

Hala diğer sunucumda böyle bir şey yapmama rağmen sorunsuz bir şekilde classic pool ile nasıl çalıştığını anlayamadım o da ayrı konu :)

Herkese İ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