﻿
{"id":9548,"date":"2018-09-25T11:52:30","date_gmt":"2018-09-25T11:52:30","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=9548"},"modified":"2018-09-25T11:52:30","modified_gmt":"2018-09-25T11:52:30","slug":"asp-net-core-2-mvc-ile-neler-degisti-genel-bakis","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-2-mvc-ile-neler-degisti-genel-bakis\/","title":{"rendered":"Asp.NET Core 2 MVC \u0130le Neler De\u011fi\u015fti? Genel Bak\u0131\u015f"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Uzun zamand\u0131r Asp.NET Core 2 MVC&#8217;de klasik Asp.NET MVC&#8217;ye nazaran hangi noktalarda de\u011fi\u015fiklik ger\u00e7ekle\u015ftirildi\u011fine dair genel bak\u0131\u015f maksatl\u0131 makale yazmay\u0131 planl\u0131yordum. Bu plan\u0131m do\u011frultusunda \u015fimdi gelin Asp.NET Core 2 MVC&#8217;de gelen yenilikleri ve de\u011fi\u015fiklikleri parsel parsel \u00f6zetleyelim.<\/p>\n<h3 style=\"color: blue;\">Asp.NET Core 2 MVC Projesinin Aya\u011fa Kald\u0131r\u0131lmas\u0131<\/h3>\n<p>\u0130lk olarak bir Asp.NET Core 2 MVC projesinin nas\u0131l aya\u011fa kald\u0131r\u0131ld\u0131\u011f\u0131na dair t\u00fcm yap\u0131ya de\u011finmemiz gerekmektedir. Asp.NET Core 2 MVC projesi olu\u015fturabilmek i\u00e7in Visual Studio edit\u00f6r\u00fcnde klasik &#8220;File&#8221; -&gt; &#8220;New&#8221; -&gt; &#8220;Project&#8221; kombinasyonu \u00fczerinden &#8220;ASP.NET Core Web Appllication&#8221; projesini se\u00e7iyoruz.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVC-\u0130le-Neler-De\u011fi\u015fti-Genel-Bak\u0131\u015f..png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-9550\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVC-\u0130le-Neler-De\u011fi\u015fti-Genel-Bak\u0131\u015f..png\" alt=\"Asp.NET Core 2 MVC \u0130le Neler De\u011fi\u015fti Genel Bak\u0131\u015f.\" width=\"694\" height=\"191\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVC-\u0130le-Neler-De\u011fi\u015fti-Genel-Bak\u0131\u015f..png 694w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVC-\u0130le-Neler-De\u011fi\u015fti-Genel-Bak\u0131\u015f.-300x83.png 300w\" sizes=\"auto, (max-width: 694px) 100vw, 694px\" \/><\/a><br \/>\nArd\u0131ndan gelen pencereden &#8220;Empty&#8221;i se\u00e7erek bo\u015f bir proje olu\u015fturuyoruz.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVC-\u0130le-Neler-De\u011fi\u015fti-Genel-Bak\u0131\u015f.-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-9551\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVC-\u0130le-Neler-De\u011fi\u015fti-Genel-Bak\u0131\u015f.-1.png\" alt=\"Asp.NET Core 2 MVC \u0130le Neler De\u011fi\u015fti Genel Bak\u0131\u015f.\" width=\"298\" height=\"187\" \/><\/a><br \/>\nA\u00e7\u0131lan projenin Solution Explorer penceresinden dosyalar\u0131na g\u00f6z atarsak e\u011fer;<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVC-\u0130le-Neler-De\u011fi\u015fti-Genel-Bak\u0131\u015f.-2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-9553\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVC-\u0130le-Neler-De\u011fi\u015fti-Genel-Bak\u0131\u015f.-2.png\" alt=\"Asp.NET Core 2 MVC \u0130le Neler De\u011fi\u015fti Genel Bak\u0131\u015f.\" width=\"221\" height=\"149\" \/><\/a><\/p>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere &#8220;Dependencies&#8221; ve &#8220;Properties&#8221; alanlar\u0131yla birlikte &#8220;wwwroot&#8221; klas\u00f6r\u00fc ve &#8220;Program.cs&#8221; ve &#8220;Startup.cs&#8221; dosyalar\u0131 mevcuttur. Bu klas\u00f6r ve dosyalar\u0131 izah etmemiz gerekirse e\u011fer;<\/p>\n<ul>\n<li><strong><em>Dependencies Alan\u0131<\/em><\/strong><br \/>\nProjede kullan\u0131lan Nuget vs. mod\u00fcllerinin tutuldu\u011fu aland\u0131r. Klasik Asp.NET MVC&#8217;de ki &#8216;References&#8217; klas\u00f6r\u00fcne denk d\u00fc\u015fmektedir.<\/li>\n<li><strong><em>Properties Alan\u0131<\/em><\/strong><br \/>\nProjeyle ilgili temel ba\u015flang\u0131\u00e7 ayarlar\u0131n\u0131n tutuldu\u011fu alan.<\/li>\n<li><strong><em>wwwroot Klas\u00f6r\u00fc<\/em><\/strong><br \/>\nProjede kullan\u0131lacak CSS, JavaScript, Image vs. dosyalar\u0131n\u0131n tutulaca\u011f\u0131 klas\u00f6r.<\/li>\n<li><strong><em>Program.cs<\/em><\/strong><br \/>\nAsp.NET Core uygulamalar\u0131nda host yap\u0131s\u0131 klasik Asp.NET mimarisine nazaran k\u00f6kl\u00fc de\u011fi\u015fikliklere tabi tutulmu\u015ftur. Bizler &#8220;Program.cs&#8221; dosyas\u0131n\u0131 Console Application projelerinden tan\u0131yoruz. Asp.NET Core mimarisinde &#8220;Program.cs&#8221; dosyas\u0131n\u0131n bulunmas\u0131 Asp.NET Core uygulamalar\u0131n\u0131n asl\u0131nda bir Console Application uygulamas\u0131 oldu\u011fu anlam\u0131na geliyor. Bu da ilgili mimarinin executable(\u00e7al\u0131\u015ft\u0131r\u0131labilir) bir alt yap\u0131da oldu\u011funu ve entry pointe(ba\u015flang\u0131\u00e7 noktas\u0131) sahip oldu\u011funu ifade etmektedir. \u0130\u015fte bu ba\u015flang\u0131\u00e7 noktas\u0131 &#8220;Program.cs&#8221; de ki static Main metodudur.\u015eimdi &#8220;Program.cs&#8221; s\u0131n\u0131f\u0131nda neler yap\u0131l\u0131yor bakal\u0131m;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Program\r\n    {\r\n        public static void Main(string&#x5B;] args)\r\n        {\r\n            CreateWebHostBuilder(args).Build().Run();\r\n        }\r\n\r\n        public static IWebHostBuilder CreateWebHostBuilder(string&#x5B;] args) =&gt;\r\n            WebHost.CreateDefaultBuilder(args)\r\n                .UseStartup&lt;Startup&gt;();\r\n    }\r\n<\/pre>\n<p>Dikkat ederseniz Main metodunda &#8220;CreateWebHostBuilder&#8221; isimli metodu \u00e7a\u011f\u0131rararak bir host in\u015fa etmekte ve bunu \u00e7al\u0131\u015ft\u0131rmaktad\u0131r. \u0130lgili metot i\u00e7erisine g\u00f6z atarsak e\u011fer ba\u015flang\u0131\u00e7 s\u0131n\u0131f\u0131 olarak &#8220;Startup&#8221; s\u0131n\u0131f\u0131n\u0131 belirtmektedir.<\/li>\n<li><strong><em>Startup.cs<\/em><\/strong><br \/>\nProjemizde herbir kullan\u0131c\u0131 ile yap\u0131lan etkile\u015fim neticesinde bir s\u00fcrece girilmektedir. \u0130\u015fte o s\u00fcreci &#8220;Startup&#8221; s\u0131n\u0131f\u0131nda kontrol edebilmekteyiz. &#8220;Startup&#8221; s\u0131n\u0131f\u0131 asl\u0131nda bir Middleware \u00f6zelli\u011fi g\u00f6rmektedir. Yap\u0131sal olarak;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Startup\r\n    {\r\n        public void ConfigureServices(IServiceCollection services)\r\n        {\r\n            \/\/Uygulamada kullan\u0131lacak servisleri burada belirterek projeye dahil ediyoruz.\r\n        }\r\n\r\n        public void Configure(IApplicationBuilder app, IHostingEnvironment env)\r\n        {\r\n            \/\/\u00c7al\u0131\u015fma zaman\u0131nda tetiklenen ayar fonksiyonudur.\r\n            if (env.IsDevelopment())\r\n            {\r\n                app.UseDeveloperExceptionPage();\r\n            }\r\n\r\n            app.Run(async (context) =&gt;\r\n            {\r\n                await context.Response.WriteAsync(&quot;Hello World!&quot;);\r\n            });\r\n        }\r\n    }\r\n<\/pre>\n<p>\u015feklinde bir yap\u0131ya sahiptir.<br \/>\nProjemizi aya\u011fa kald\u0131r\u0131rken &#8220;Startup&#8221; s\u0131n\u0131f\u0131nda a\u015fa\u011f\u0131daki ayarlar\u0131 yapabiliriz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Startup\r\n    {\r\n        public void ConfigureServices(IServiceCollection services)\r\n        {\r\n            \/\/MVC mod\u00fcl\u00fcn\u00fc projemizde yap\u0131land\u0131ral\u0131m.\r\n            services.AddMvc();\r\n        }\r\n\r\n        public void Configure(IApplicationBuilder app, IHostingEnvironment env)\r\n        {\r\n            \/\/Varsay\u0131lan route yap\u0131lanmas\u0131yla MVC'yi kullanabiliriz.\r\n            \/\/app.UseMvcWithDefaultRoute();\r\n\r\n            \/\/Ya da route yap\u0131lanmas\u0131n\u0131 manuel olu\u015fturmak kayd\u0131yla MVC'yi kullanabiliriz.\r\n            app.UseMvc(routes =&gt;\r\n            {\r\n                routes.MapRoute(\r\n                    name: &quot;default&quot;,\r\n                    template: &quot;{controller=Home}\/{action=Index}\/{id?}&quot;\r\n                    );\r\n                routes.MapRoute(\r\n                    name: &quot;About&quot;,\r\n                    template: &quot;about&quot;,\r\n                    defaults: new { controller = &quot;Home&quot;, action = &quot;About&quot; }\r\n                    );\r\n            });\r\n\r\n            \/\/Uygulamadaki wwwroot klas\u00f6r\u00fcn\u00fcn i\u00e7erisindeki t\u00fcm dosyalara proje genelinden static bir \u015fekilde eri\u015fim izni vermek i\u00e7in UseStaticFiles fonksiyonu ile ilgili dosyay\u0131 eri\u015fime a\u00e7\u0131yoruz.\r\n            app.UseStaticFiles();\r\n\r\n            \/\/Projede al\u0131nan hatalar\u0131n kullan\u0131c\u0131ya g\u00f6sterilmesini isteyebiliriz.\r\n            \/\/app.UseDeveloperExceptionPage();\r\n\r\n            \/\/Ya da sadece development esnas\u0131ndaysak kullan\u0131c\u0131lara hata sayfas\u0131n\u0131 g\u00f6sterebiliriz.\r\n            if (env.IsDevelopment())\r\n                app.UseDeveloperExceptionPage();\r\n\r\n            \/\/Aran\u0131lan kaynak bulunamad\u0131\u011f\u0131 durumlarda 404 hatas\u0131n\u0131n kullan\u0131c\u0131ya g\u00f6terilmesini istiyorsak UseStatusCodePages fonksiyonu \u00e7a\u011f\u0131rmam\u0131z yeterlidir.\r\n            app.UseStatusCodePages();\r\n        }\r\n    }\r\n<\/pre>\n<p>Genel olarak kod \u00fczerine kullan\u0131lan fonksiyonlar\u0131n a\u00e7\u0131klamalar\u0131n\u0131 yapm\u0131\u015f bulunmaktay\u0131m.<\/li>\n<\/ul>\n<p>Evet&#8230; Proje dosyalar\u0131m\u0131z\u0131n ne oldu\u011funu g\u00f6rd\u00fck, alt yap\u0131 olarak MVC olacak \u015fekilde gerekli ayarlamalar\u0131 ger\u00e7ekle\u015ftirdik. \u015eimdi projemizin ana dizinine &#8220;Models&#8221;, &#8220;Views&#8221; ve &#8220;Controllers&#8221; isimlerinde \u00fc\u00e7 adet klas\u00f6r olu\u015fturuyoruz ve Asp.NET Core 2 MVC projemizi bu \u015fekilde aya\u011fa kald\u0131rm\u0131\u015f oluyoruz&#8230;<\/p>\n<h3 style=\"color: blue;\">_ViewImports Dosyas\u0131 \u0130le Global Yap\u0131lanma<\/h3>\n<p>Klasik Asp.NET MVC&#8217;de .cshtml dosyalar\u0131na model tan\u0131mlarken ya modelin bulundu\u011fu namespaceleri tam olarak belirtmemiz gerekmekteydi ya da web.config&#8217;den modellerin bulundu\u011fu namespace&#8217;i t\u00fcm viewlere global bir \u015fekilde bir kere tan\u0131mlay\u0131p sunmam\u0131z yeterliydi. Asp.NET Core 2 MVC&#8217;de art\u0131k web.config dosyas\u0131 bulunmad\u0131\u011f\u0131ndan dolay\u0131 bu i\u015flevi &#8220;_ViewImports.cshtml&#8221; dosyas\u0131 \u00fcstlenmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n@model CoreExample.Web.Models.Employee\r\n\r\n&lt;h2&gt;Employee&lt;\/h2&gt;\r\n<\/pre>\n<p>Yukar\u0131daki \u00f6rnek .cshtml sayfas\u0131nda oldu\u011fu gibi model tan\u0131mlan\u0131rken modelin bulundu\u011fu t\u00fcm namespaceleri belirtmemiz gerekmektedir. \u015eimdi bu namespace&#8217;i t\u00fcm viewlere global olarak tan\u0131mlamak istiyorsak ilgili klas\u00f6re Razor View Imports dosyas\u0131n\u0131 &#8220;_ViewImports.cshtml&#8221; isminde eklemeniz gerekmektedir.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVC-\u0130le-Neler-De\u011fi\u015fti-Genel-Bak\u0131\u015f.-3.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-9564\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVC-\u0130le-Neler-De\u011fi\u015fti-Genel-Bak\u0131\u015f.-3.png\" alt=\"Asp.NET Core 2 MVC \u0130le Neler De\u011fi\u015fti Genel Bak\u0131\u015f.\" width=\"183\" height=\"78\" \/><\/a><br \/>\n\u0130lgili dosyan\u0131n i\u00e7eri\u011fini a\u015fa\u011f\u0131daki gibi \u015fekillendirirsek;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n@using CoreExample.Web.Models\r\n<\/pre>\n<p>Art\u0131k bu namespace global olarak tutulaca\u011f\u0131 i\u00e7in view dosyalar\u0131nda direkt olarak ilgili modeli namespace&#8217;i belirtmeksizin \u00e7a\u011f\u0131rabilmekteyiz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n@model Employee\r\n\r\n&lt;h2&gt;Employee&lt;\/h2&gt;\r\n<\/pre>\n<h3 style=\"color: blue;\">Tag Helper Yap\u0131lanmas\u0131<\/h3>\n<p>Klasik Asp.NET MVC&#8217;de ki Html.Helper alt\u0131ndaki t\u00fcm helper metotlar\u0131 gitti yerine tag helperlar geldi.<br \/>\nTag helperlar\u0131 kullanabilmek i\u00e7in kullan\u0131laca\u011f\u0131 sayfan\u0131n en \u00fcst sat\u0131r\u0131na a\u015fa\u011f\u0131daki kodu eklemeniz gerekmektedir.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers\r\n<\/pre>\n<p>ya da tek tek view dosyalar\u0131na eklemekle u\u011fra\u015fmaktansa &#8220;_ViewImports.cshtml&#8221; dosyas\u0131na da ekleyebilirsiniz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n@using CoreExample.Web.Models\r\n@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers\r\n<\/pre>\n<p>Bu i\u015flemden sonra tag helperlar\u0131 a\u015fa\u011f\u0131daki gibi kullanabilirsiniz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n@model Employee\r\n\r\n&lt;h2&gt;Employee&lt;\/h2&gt;\r\n\r\n&lt;p&gt;\r\n    &lt;label asp-for=&quot;Name&quot;&gt;Name&lt;\/label&gt;\r\n    &lt;input asp-for=&quot;Name&quot; \/&gt;\r\n&lt;\/p&gt;\r\n&lt;p&gt;\r\n    &lt;label asp-for=&quot;SurName&quot;&gt;Surname&lt;\/label&gt;\r\n    &lt;input asp-for=&quot;SurName&quot; \/&gt;\r\n&lt;\/p&gt;\r\n&lt;p&gt;\r\n    &lt;label asp-for=&quot;Age&quot;&gt;Age&lt;\/label&gt;\r\n    &lt;input asp-for=&quot;Age&quot; \/&gt;\r\n&lt;\/p&gt;\r\n<\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere tag helperlar \u00fcretecekleri html elemanlar\u0131 kullan\u0131ld\u0131\u011f\u0131 sayfan\u0131n modeline uygun bir \u015fekilde bind etmekte ve hatta e\u015fle\u015ftirilen propertynin tipine g\u00f6re olu\u015fturulacak inputun de\u011feri otomatik belirlenmektedir.(string ise text, int ise number vs.)<\/p>\n<p>Hatta tag helperlar yaz\u0131m esnas\u0131nda sayfa modelinin memberlar\u0131n\u0131 IntelliSense arac\u0131l\u0131\u011f\u0131yla kar\u015f\u0131m\u0131za getirmektedir.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVC-\u0130le-Neler-De\u011fi\u015fti-Genel-Bak\u0131\u015f.-4.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-9570\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVC-\u0130le-Neler-De\u011fi\u015fti-Genel-Bak\u0131\u015f.-4.png\" alt=\"Asp.NET Core 2 MVC \u0130le Neler De\u011fi\u015fti Genel Bak\u0131\u015f.\" width=\"292\" height=\"229\" \/><\/a><br \/>\n\u0130\u015fte bu \u00f6zellik harika \ud83d\ude42<\/p>\n<p>Ayr\u0131ca klasik Asp.NET MVC&#8217;de ki Action ya da ActionLink helper metotlar\u0131n\u0131n yerine a\u015fa\u011f\u0131daki gibi &#8220;asp-action&#8221; ve &#8220;asp-controller&#8221; tag helperlar\u0131 gelmi\u015ftir.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n@* Ayn\u0131 Controller'da ise; \/Home\/Page*@\r\n&lt;a asp-action=&quot;Page&quot;&gt;Page1&lt;\/a&gt;\r\n@*\/Home\/Page*@\r\n&lt;a asp-action=&quot;Page&quot; asp-controller=&quot;Home&quot;&gt;Page2&lt;\/a&gt;\r\n@* \/Home\/Page\/5?name=gencay *@\r\n&lt;a asp-action=&quot;Page&quot; asp-controller=&quot;Home&quot; asp-route-id=&quot;5&quot; asp-route-name=&quot;gencay&quot;&gt;Page3&lt;\/a&gt;\r\n@* \/Home\/Page\/5?name=gencay *@\r\n&lt;a asp-action=&quot;Page&quot; asp-controller=&quot;Home&quot;\r\n   asp-all-route-data='new Dictionary&lt;string, string&gt;\r\n{\r\n    { &quot;name&quot;,&quot;gencay&quot;},\r\n    { &quot;id&quot;,&quot;5&quot;}\r\n}'&gt;Page4&lt;\/a&gt;\r\n<\/pre>\n<h3 style=\"color: blue;\">Form Yap\u0131lanmas\u0131<\/h3>\n<p>Form yap\u0131lar\u0131 art\u0131k html olarak a\u015fa\u011f\u0131daki gibi tasarlanmaktad\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n@model Employee\r\n\r\n&lt;form method=&quot;post&quot; asp-action=&quot;Save&quot; asp-controller=&quot;Employee&quot;&gt;\r\n    &lt;p&gt;\r\n        &lt;label asp-for=&quot;Name&quot;&gt;Name&lt;\/label&gt;\r\n        &lt;input asp-for=&quot;Name&quot; \/&gt;\r\n    &lt;\/p&gt;\r\n    &lt;p&gt;\r\n        &lt;label asp-for=&quot;SurName&quot;&gt;Surname&lt;\/label&gt;\r\n        &lt;input asp-for=&quot;SurName&quot; \/&gt;\r\n    &lt;\/p&gt;\r\n    &lt;p&gt;\r\n        &lt;label asp-for=&quot;Age&quot;&gt;Age&lt;\/label&gt;\r\n        &lt;input asp-for=&quot;Age&quot; \/&gt;\r\n    &lt;\/p&gt;\r\n    &lt;p&gt;\r\n        &lt;button type=&quot;submit&quot;&gt;Save&lt;\/button&gt;\r\n    &lt;\/p&gt;\r\n&lt;\/form&gt;\r\n<\/pre>\n<h3 style=\"color: blue;\">Form Validations<\/h3>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Employee\r\n    {\r\n        public int Id { get; set; }\r\n        &#x5B;Required(ErrorMessage = &quot;Enter the name field&quot;)]\r\n        public string Name { get; set; }\r\n        &#x5B;Required(ErrorMessage = &quot;Enter the surname field&quot;)]\r\n        public string SurName { get; set; }\r\n        public int Age { get; set; }\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class EmployeeController : Controller\r\n    {\r\n        public IActionResult Save() =&gt; View();\r\n        &#x5B;HttpPost]\r\n        public IActionResult Save(Employee employee)\r\n        {\r\n            if (ModelState.IsValid)\r\n                Content(&quot;Kay\u0131t ger\u00e7ekle\u015ftirildi.&quot;);\r\n\r\n            return View(employee);\r\n        }\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n@model Employee\r\n\r\n&lt;form method=&quot;post&quot; asp-action=&quot;Save&quot; asp-controller=&quot;Employee&quot;&gt;\r\n    &lt;p&gt;\r\n        &lt;div asp-validation-summary=&quot;All&quot;&gt;&lt;\/div&gt;\r\n    &lt;\/p&gt;\r\n    &lt;p&gt;\r\n        &lt;label asp-for=&quot;Name&quot;&gt;Name&lt;\/label&gt;\r\n        &lt;input asp-for=&quot;Name&quot; \/&gt;\r\n    &lt;\/p&gt;\r\n    &lt;p&gt;\r\n        &lt;label asp-for=&quot;SurName&quot;&gt;Surname&lt;\/label&gt;\r\n        &lt;input asp-for=&quot;SurName&quot; \/&gt;\r\n    &lt;\/p&gt;\r\n    &lt;p&gt;\r\n        &lt;label asp-for=&quot;Age&quot;&gt;Age&lt;\/label&gt;\r\n        &lt;input asp-for=&quot;Age&quot; \/&gt;\r\n    &lt;\/p&gt;\r\n    &lt;p&gt;\r\n        &lt;button type=&quot;submit&quot;&gt;Save&lt;\/button&gt;\r\n    &lt;\/p&gt;\r\n&lt;\/form&gt;\r\n<\/pre>\n<p>Yukar\u0131da div eleman\u0131nda g\u00f6rd\u00fc\u011f\u00fcn\u00fcz &#8220;asp-validation-summary&#8221; tag helper\u0131 ile validasyon mesajlar\u0131 h\u0131zl\u0131ca verilebilmektedir.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVC-\u0130le-Neler-De\u011fi\u015fti-Genel-Bak\u0131\u015f.-5.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-9576\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVC-\u0130le-Neler-De\u011fi\u015fti-Genel-Bak\u0131\u015f.-5.png\" alt=\"Asp.NET Core 2 MVC \u0130le Neler De\u011fi\u015fti Genel Bak\u0131\u015f.\" width=\"245\" height=\"191\" \/><\/a><\/p>\n<h3 style=\"color: blue;\">View Components<\/h3>\n<p>Asp.NET Core ile hayat\u0131m\u0131za giri\u015f yapm\u0131\u015f olan yepyeni bir terimdir. Kullan\u0131m olarak Partial View yap\u0131lar\u0131na benzemektedirler lakin i\u015fleyi\u015f olarak ba\u015fl\u0131 ba\u015f\u0131na bir cevherdirler.<\/p>\n<p><strong>Peki ne i\u015fe yaramaktad\u0131r View Componentler?<\/strong><br \/>\nOlay\u0131 ilk olarak Partial View yap\u0131lar\u0131yla ele alal\u0131m. MVC mimarisinde veri k\u00fcmesi kullanan bir Partial View&#8217;i her tetikledi\u011fimizde ilgili partial view controller ile ba\u011flant\u0131s\u0131n\u0131 kuracak ve kullanaca\u011f\u0131 modeli bu ba\u011flant\u0131 \u00fczerinden talep edecektir.<br \/>\n\u00d6rne\u011fin;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n@model IEnumerable&lt;CoreExample.Web.Models.Employee&gt;\r\n\r\n&lt;ul&gt;\r\n    @foreach (var employee in Model)\r\n    {\r\n        &lt;li&gt;\r\n            @employee.Name @employee.SurName - @employee.Age\r\n        &lt;\/li&gt;\r\n    }\r\n&lt;\/ul&gt;\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n@model Employee\r\n\r\n@Html.Partial(&quot;~\/Views\/Home\/Partials\/_EmployeeList.cshtml&quot;, ViewBag.Models as IEnumerable&lt;Employee&gt;)\r\n<\/pre>\n<p>Burada g\u00f6rd\u00fc\u011f\u00fcn\u00fcz \u00fczere partial view&#8217;a modeli controllerdan ViewBag.Models de\u011fi\u015fkenine atayarak getirmekteyiz. \u0130\u015fte View Componentler, partial viewlerin bu controller&#8217;a olan ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n\u0131 ortadan kald\u0131rmakta ve talep geldi\u011fi zaman direkt olarak modele gidip gereken veritaban\u0131 i\u015flemlerini hallettikten sonra view&#8217;e yans\u0131tmaktad\u0131r. Dolay\u0131s\u0131yla controller ile bir ili\u015fi\u011fi olmayaca\u011f\u0131ndan dolay\u0131 daha h\u0131zl\u0131 ve performansl\u0131 \u00e7al\u0131\u015facakt\u0131r.<\/p>\n<p>View Componentleri kullanabilmek i\u00e7in projenin ana dizininde &#8220;ViewComponents&#8221; isminde bir klas\u00f6r eklenerek ard\u0131ndan i\u00e7erisine yap\u0131lacak i\u015flemi ifade eden bir isimde class olu\u015fturulur. \u00d6rne\u011fin; <em>EmployeeViewComponent<\/em><br \/>\n\u0130\u00e7erisinde gerekli i\u015flemler yap\u0131l\u0131r;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class EmployeeViewComponent : ViewComponent\r\n    {\r\n        public IViewComponentResult Invoke()\r\n        {\r\n            List&lt;Employee&gt; employeeList = new List&lt;Employee&gt; {\r\n                new Employee{\r\n                     Id = 1,\r\n                      Age = 26,\r\n                       Name = &quot;Gen\u00e7ay&quot;,\r\n                        SurName = &quot;Y\u0131ld\u0131z&quot;\r\n                },\r\n                new Employee{\r\n                     Id = 2,\r\n                      Age = 34,\r\n                       Name = &quot;Mehmet&quot;,\r\n                        SurName = &quot;\u0130lhan&quot;\r\n                }\r\n            };\r\n\r\n            return View(employeeList);\r\n        }\r\n    }\r\n<\/pre>\n<p>Burada dikkat etmeniz gereken hususlardan biri ilgili s\u0131n\u0131f\u0131n isminin sonuna &#8220;..ViewComponent&#8221; ekinin eklenmesidir. Bir di\u011feri ilgili s\u0131n\u0131f\u0131 &#8220;ViewComponent&#8221; s\u0131n\u0131f\u0131ndan t\u00fcretilmesi gerekmektedir. Ve son dikkat edilmesi gereken husus ise bu View Componentin yapaca\u011f\u0131 i\u015fi geriye &#8220;IViewComponentResult&#8221; interface tipinde de\u011fer d\u00f6nen &#8220;Invoke&#8221; isimli metot i\u00e7erisinde yap\u0131lmas\u0131d\u0131r.<\/p>\n<p>\u015eimdi olu\u015fturulan bu View Componenti kullanal\u0131m.<br \/>\nAsp.NET Core View Componentleri \u00e7al\u0131\u015fma zaman\u0131nda a\u015fa\u011f\u0131daki yollarda aramaktad\u0131r;<\/p>\n<ul>\n<li>Views\/&lt;ControllerName&gt;\/Components\/&lt;ViewComponentName&gt;\/&lt;ViewName&gt;<\/li>\n<li>Views\/Shared\/Components\/&lt;ViewComponentName&gt;\/&lt;ViewName&gt;<\/li>\n<\/ul>\n<p>Biz makalemizde ikinci yolu baz alaca\u011f\u0131z.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVC-\u0130le-Neler-De\u011fi\u015fti-Genel-Bak\u0131\u015f.-6.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVC-\u0130le-Neler-De\u011fi\u015fti-Genel-Bak\u0131\u015f.-6.png\" alt=\"Asp.NET Core 2 MVC \u0130le Neler De\u011fi\u015fti Genel Bak\u0131\u015f.\" width=\"201\" height=\"128\" class=\"aligncenter size-full wp-image-9587\" \/><\/a><br \/>\n\u0130lgili view componenti \u00e7a\u011f\u0131r\u0131rken a\u015fa\u011f\u0131daki gibi Invoke edilmesi yeterlidir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n@model Employee\r\n\r\n@await Component.InvokeAsync(&quot;Employee&quot;)\r\n<\/pre>\n<h3 style=\"color: blue;\">NuGet &#8211; Harici K\u00fct\u00fcphanelerin Y\u00f6netimi<\/h3>\n<p>Harici paketleri y\u00f6netebilmek i\u00e7in projeye sa\u011f t\u0131klay\u0131p &#8220;Edit -ProjeAdi-.csproj&#8221; sekmesine t\u0131klay\u0131n\u0131z.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVC-\u0130le-Neler-De\u011fi\u015fti-Genel-Bak\u0131\u015f.-7.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVC-\u0130le-Neler-De\u011fi\u015fti-Genel-Bak\u0131\u015f.-7.png\" alt=\"Asp.NET Core 2 MVC \u0130le Neler De\u011fi\u015fti Genel Bak\u0131\u015f.\" width=\"325\" height=\"231\" class=\"aligncenter size-full wp-image-9589\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVC-\u0130le-Neler-De\u011fi\u015fti-Genel-Bak\u0131\u015f.-7.png 325w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVC-\u0130le-Neler-De\u011fi\u015fti-Genel-Bak\u0131\u015f.-7-300x213.png 300w\" sizes=\"auto, (max-width: 325px) 100vw, 325px\" \/><\/a><br \/>\nBu i\u015flemden sonra a\u00e7\u0131lan pencerede projede kullan\u0131lan t\u00fcm harici mod\u00fclleri g\u00f6rebilirsiniz. &#8220;Dependencies&#8221; -> &#8220;NuGet&#8221; kombinasyonu alt\u0131nda birden fazla k\u00fct\u00fcphane olabilir lakin proje publish edildi\u011finde projeye ait edit dosyas\u0131nda bulunan mod\u00fcller haricindekiler silinecektir.<\/p>\n<h3 style=\"color: blue;\">npm Configuration File \u0130le Mod\u00fcl Y\u00f6netimi<\/h3>\n<p>Projeye &#8220;package.json&#8221; isminde bir &#8220;npm Configuration File&#8221; dosyas\u0131 ekledi\u011finizde bu dosya \u00fczerinden t\u00fcm mod\u00fcl install ya da uninstall y\u00f6netimini sa\u011flayabilirsiniz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n{\r\n  &quot;version&quot;: &quot;1.0.0&quot;,\r\n  &quot;name&quot;: &quot;asp.net&quot;,\r\n  &quot;private&quot;: true,\r\n  &quot;devDependencies&quot;: {\r\n    &quot;bootstrap&quot;: &quot;4.1.3&quot;,\r\n    &quot;jquery&quot;: &quot;3.3.1&quot;\r\n  }\r\n}\r\n<\/pre>\n<p>Projeye entegre etmek istedi\u011fimiz t\u00fcm mod\u00fclleri &#8220;devDependencies&#8221; alan\u0131na belirttikten sonra tek yapmam\u0131z gereken dosyay\u0131 kaydetmemiz. Gerisini Visual Studio bizim i\u00e7in halledecek ve mod\u00fclleri projeye entegre edecektir. Entegre edilen harici mod\u00fclleri &#8220;Dependencies&#8221; -> &#8220;npm&#8221; dizini alt\u0131nda g\u00f6rebilirsiniz.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVC-\u0130le-Neler-De\u011fi\u015fti-Genel-Bak\u0131\u015f.-8.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVC-\u0130le-Neler-De\u011fi\u015fti-Genel-Bak\u0131\u015f.-8.png\" alt=\"Asp.NET Core 2 MVC \u0130le Neler De\u011fi\u015fti Genel Bak\u0131\u015f.\" width=\"187\" height=\"153\" class=\"aligncenter size-full wp-image-9595\" \/><\/a><\/p>\n<p>Evet.. Bu i\u00e7eri\u011fimizde Asp.NET Core 2 MVC mimarisinde m\u00fchim olan ve ilgimi \u00e7eken yeniliklere ve farkl\u0131l\u0131klara \u00f6zet mahiyetinde de\u011finmi\u015f bulunmaktay\u0131m. Elbetteki sonraki yaz\u0131lar\u0131mda burada de\u011findi\u011fim ya da de\u011finmedi\u011fim bir\u00e7ok konuyu hususi olarak de\u011ferlendirecek ve detayl\u0131 i\u00e7erikler olu\u015fturaca\u011f\u0131z.<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<\/p>\n<p>\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Uzun zamand\u0131r Asp.NET Core 2 MVC&#8217;de klasik Asp.NET MVC&#8217;ye nazaran hangi noktalarda de\u011fi\u015fiklik ger\u00e7ekle\u015ftirildi\u011fine dair genel bak\u0131\u015f maksatl\u0131 makale yazmay\u0131 planl\u0131yordum. Bu plan\u0131m do\u011frultusunda \u015fimdi gelin Asp.NET Core 2 MVC&#8217;de gelen yenilikleri ve&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":9596,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2656],"tags":[2650,2652,2651,2653,2655,2658,2654,2657],"class_list":["post-9548","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-asp-net-core-2-mvc","tag-_viewimports","tag-asp-net-core-2","tag-asp-net-core-2-mvc","tag-asp-net-core-2-mvc-projesi-olusturma","tag-form-validations","tag-npm-configuration-file","tag-tag-helper","tag-view-components"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/9548","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=9548"}],"version-history":[{"count":39,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/9548\/revisions"}],"predecessor-version":[{"id":9597,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/9548\/revisions\/9597"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/9596"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=9548"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=9548"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=9548"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}