﻿
{"id":1153,"date":"2012-12-21T00:13:48","date_gmt":"2012-12-21T00:13:48","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=1153"},"modified":"2012-12-21T00:18:25","modified_gmt":"2012-12-21T00:18:25","slug":"mvc-attribute-olusturma","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/mvc-attribute-olusturma\/","title":{"rendered":"MVC Attribute Olu\u015fturma"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Bu yaz\u0131mda, genellikle kontrol ve do\u011frulama i\u015flemlerinde kullan\u0131lan attribute kavram\u0131n\u0131 ve attribute olu\u015fturmay\u0131 irdeleyece\u011fiz.Attribute, metod kavram\u0131nda oldu\u011fu gibi, bir kere yaz her yerde kullan d\u00fc\u015f\u00fcncesiyle geli\u015ftirilmi\u015f yap\u0131lard\u0131r.<br \/>\n<!--more--><br \/>\nAttribute&#8217;lar arka planda nesneler \u00fczerinden i\u015flem yaparlar ve asl\u0131nda birer nesnedirler.\u0130ki t\u00fcr attribute yap\u0131s\u0131 bulunmaktad\u0131r.<\/p>\n<ul>\n<li>CLR i\u00e7inde gelen attribute<\/li>\n<li>Yaz\u0131l\u0131mc\u0131n\u0131n kendisinin olu\u015fturdu\u011fu attribute<\/li>\n<\/ul>\n<p><span style=\"font-size: x-small;\">Attribute&#8217;lar hakk\u0131nda detayl\u0131 bilgi edinmek istiyorsan\u0131z, <a href=\"http:\/\/www.csharpnedir.com\/articles\/read\/?id=523&amp;title=C\" target=\"_blank\">C#&#8217;ta Nitelikler (Attributes)<\/a> ba\u015fl\u0131kl\u0131 yaz\u0131y\u0131 inceleyebilirsiniz.<\/span><br \/>\nAttribute&#8217;lar a\u015fa\u011f\u0131daki gibi kullan\u0131lmaktad\u0131rlar.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        &#x5B;AttributeAdi]\r\n        public void Metodumuz()\r\n        {\r\n\r\n        }\r\n\/\/veya\r\n        &#x5B;AttributeAdi]\r\n        public class Class\u0131m\u0131z\r\n        {\r\n\r\n        }\r\n<\/pre>\n<p>Asp.NET Web Form mimarisinden ziyade, Asp.NET MVC mimarisinde daha yo\u011fun attribute kullan\u0131m\u0131 yapmaktay\u0131z.Haliyle, bug\u00fcne kadar MVC konular\u0131yla ilgilenen biri fark\u0131nda olsun ya da olmas\u0131n attribute kavram\u0131n\u0131 kullanm\u0131\u015ft\u0131r.MVC ile ilgili yaz\u0131lar\u0131m\u0131 kronolojik olarak incelerseniz e\u011fer, Model ve Controller katman\u0131nda olsun, ba\u015fka s\u0131n\u0131flarda olsun attributelar kullanm\u0131\u015ft\u0131k.<\/p>\n<p>MVC&#8217;de kulland\u0131\u011f\u0131m\u0131z baz\u0131 attributelar\u0131 \u015f\u00f6yle bi hat\u0131rlayal\u0131m..<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n&#x5B;HttpPost]\r\n<\/pre>\n<p>Controller katman\u0131nda Post i\u015fleminden sonra \u00e7al\u0131\u015facak metodu g\u00f6steren attribute.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n&#x5B;Bind(Include = &quot;..&quot;)]\r\n<\/pre>\n<p>Model katman\u0131nda hangi propertylerin validation i\u015flemlerine tabii tutulaca\u011f\u0131n\u0131 Bind eden attribute.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n&#x5B;MetadataType(typeof(Sinif))]\r\n<\/pre>\n<p>Model katman\u0131nda, &#8220;Bind&#8221; attributeu ile i\u015faretlenen propertylerin kontrollerinin hangi s\u0131n\u0131fta yap\u0131laca\u011f\u0131n\u0131 s\u00f6yleyen attribute.<br \/>\nYukar\u0131da MVC&#8217;de kulland\u0131\u011f\u0131m\u0131z baz\u0131 attributelar verilmi\u015ftir.E\u011fer bu yaz\u0131y\u0131 okuyorsan\u0131z, MVC hakk\u0131nda az \u00e7ok bilginiz var demektir.O halde bu attributelar\u0131n metodlar \u00fczerinde nas\u0131l yap\u0131da bulunduklar\u0131n\u0131 rahat\u00e7a an\u0131msayabilecek seviyedesinizdir.Zaten yaz\u0131m\u0131n ilk ba\u015flar\u0131nda attributelar\u0131n nas\u0131l kullan\u0131ld\u0131klar\u0131n\u0131 yazm\u0131\u015f oldu\u011fumdan, bu attributelar\u0131n nas\u0131l kullan\u0131ld\u0131klar\u0131n\u0131 g\u00f6sterme l\u00fczumu g\u00f6rm\u00fcyorum.<\/p>\n<p>Bu yaz\u0131da, bir attribute nas\u0131l olu\u015fturulur onu irdeleyece\u011fimizi belirtmi\u015ftik.Ben \u00f6rnek olarak, &#8220;Authorize&#8221; attributeuna benzer bir nitelik olu\u015fturaca\u011f\u0131m.<\/p>\n<p>Authorize, Asp.NET MVC Membership yap\u0131s\u0131nda bir g\u00fcvenlik attributeudur.Membership dedi\u011fimiz yap\u0131, \u00fcyelik yap\u0131s\u0131 oldu\u011fu i\u00e7in, bende her projemde bu gibi durumlar\u0131 kendim haz\u0131rlay\u0131p yazma ve olu\u015fturma tarafl\u0131s\u0131 oldu\u011fum i\u00e7in, Membership konusuna hakim de\u011filim.Bu y\u00fczden Authorize isimli attributea ve Membership konusuna bu yaz\u0131mda ve san\u0131r\u0131m hi\u00e7 bir yaz\u0131mda yer vermeyece\u011fim.<\/p>\n<p>Ancak Authorize attributeunun i\u015flevini \u015f\u00f6yle detayland\u0131rabilirim.Controller katman\u0131nda herhangi bir Authorize nitelikli ActionResult tipinden metod \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131 zaman, e\u011fer \u00fcye giri\u015fi yap\u0131lm\u0131\u015f ise bu metod \u00e7al\u0131\u015ft\u0131r\u0131lacak ve View katman\u0131ndaki gerekli dosyas\u0131 a\u00e7\u0131lacakt\u0131r, yok e\u011fer \u00fcye giri\u015fi yap\u0131lmam\u0131\u015f ise bu metod \u00e7al\u0131\u015fmayacakt\u0131r ve \u00fcye giri\u015f sayfas\u0131na y\u00f6nlendirilecektir.<\/p>\n<p>Anlayaca\u011f\u0131n\u0131z, Authorize attributeunu kulland\u0131\u011f\u0131m ActionResult tipinden olan metoduma, sisteme giri\u015f yapmayanlar\u0131n eri\u015febilmesini engelleme i\u015flemi yapmaktad\u0131r.<\/p>\n<p>Benim bu yaz\u0131mda olu\u015fturaca\u011f\u0131m \u00f6rnek ise, ayn\u0131 i\u015flemi yapacak olan bir attribute yazmakt\u0131r.Ancak bu yazaca\u011f\u0131m attribute&#8217;un i\u00e7eri\u011finde sadece basit bir kontrol bulunacakt\u0131r.<\/p>\n<p>O halde \u00f6rne\u011fimizi yapmaya ba\u015flayal\u0131m.<\/p>\n<p>Olu\u015fturdu\u011fumuz herhangi bir MVC projesine &#8220;Attributelar&#8221; isminde bir klas\u00f6r ekliyorum ve i\u00e7ine &#8220;GirisGuvenligi.cs&#8221; ad\u0131nda bir s\u0131n\u0131f ekliyorum.Bu s\u0131n\u0131f i\u00e7ersinde attribute olu\u015fturaca\u011f\u0131m.A\u015fa\u011f\u0131daki kodlar\u0131 inceleyiniz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing System.Web.Mvc;\r\nnamespace MVCAttribute.Attributelar\r\n{\r\n    public class GirisGuvenligi : ActionFilterAttribute\r\n    {\r\n        public override void OnActionExecuting(ActionExecutingContext filterContext)\r\n        {\r\n            if (HttpContext.Current.Session&#x5B;&quot;Giris&quot;].ToString() == &quot;0&quot;)\r\n            {\r\n                filterContext.HttpContext.Response.Redirect(&quot;\/Giris\/Kontrol&quot;);\r\n            }\r\n            base.OnActionExecuting(filterContext);\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>Yukar\u0131daki kodlar\u0131 incelerseniz e\u011fer, &#8220;GirisGuvenligi&#8221; ismindeki s\u0131n\u0131f\u0131m\u0131za, &#8220;ActionFilterAttribute&#8221; s\u0131n\u0131f\u0131ndan kal\u0131t\u0131m ald\u0131r\u0131yoruz.Daha sonra, &#8220;OnActionExecuting&#8221; metodunu override edip, i\u00e7inde Session&#8217;da &#8220;Giris&#8221; isimli de\u011fi\u015fkenin de\u011ferinin &#8220;0&#8221; olup olmad\u0131\u011f\u0131n\u0131 kontrol ediyoruz.E\u011fer &#8220;0&#8221; ise, &#8220;Giris(Controller)&#8221; ismindeki Controller s\u0131n\u0131f\u0131nda bulunan &#8220;Kontrol&#8221; isimli ActionResult tipinden bir s\u0131n\u0131f\u0131 \u00e7al\u0131\u015ft\u0131racakt\u0131r.E\u011fer &#8220;0&#8221; de\u011filse, yap\u0131lacak i\u015fleme devam edecektir.<\/p>\n<p>&#8220;Giris(Controller)&#8221; isimli Controller s\u0131n\u0131f\u0131na da g\u00f6z atarsak e\u011fer,<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing System.Web.Mvc;\r\nusing MVCAttribute.Attributelar;\r\n\/\/Attributelar klas\u00f6r\u00fcn\u00fc kullanabilmek i\u00e7in buraya eklemeliyiz.\r\nnamespace MVCAttribute.Controllers\r\n{\r\n    public class GirisController : Controller\r\n    {\r\n        public ActionResult Index()\r\n        {\r\n            if (Session&#x5B;&quot;Giris&quot;] != null)\r\n                Session.Add(&quot;Giris&quot;, &quot;1&quot;);\r\n            else\r\n                Session&#x5B;&quot;Giris&quot;] = &quot;1&quot;;\r\n\r\n            return View();\r\n        }\r\n        public ActionResult Kontrol()\r\n        {\r\n            return View();\r\n        }\r\n        &#x5B;GirisGuvenligi]\r\n        public ActionResult GirisYap()\r\n        {\r\n            return View();\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>Yukar\u0131daki g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, &#8220;Giris(Controller)&#8221; isimli Controller s\u0131n\u0131f\u0131n\u0131n b\u00fct\u00fcn ActionResult tipinden metodlar\u0131 bunlard\u0131r.Bu metodlar\u0131n View katmanlar\u0131nda &#8220;Giris&#8221; klas\u00f6r\u00fc i\u00e7inde dosyalar\u0131 olu\u015fturulmu\u015ftur.Mant\u0131k olarak, \u00f6ncelikle &#8220;Index&#8221; metodunu \u00e7al\u0131\u015ft\u0131r\u0131p Session&#8217;daki &#8220;Giris&#8221; de\u011ferini doldururuz.&#8221;GirisGuvenligi&#8221; ismini verdi\u011fimiz attributeumuzu &#8220;GirisYap&#8221; metodumuzda kullanm\u0131\u015f\u0131z.E\u011fer bu metodumuz \u00e7al\u0131\u015ft\u0131r\u0131l\u0131rsa, &#8220;GirisGuvenligi&#8221; isimli attribute i\u015fleve girer ve Session&#8217;daki &#8220;Giris&#8221; de\u011fi\u015fkenindeki de\u011fere g\u00f6re ya bize GirisYap sayfas\u0131n\u0131 a\u00e7ar ya da Kontrol sayfas\u0131na y\u00f6nlendirir.<\/p>\n<p>Yukar\u0131daki kodlarda, &#8220;Index&#8221; metodunda, Session&#8217;daki &#8220;Giris&#8221; de\u011fi\u015fkenine &#8220;1&#8221; de\u011feri atand\u0131\u011f\u0131ndan dolay\u0131, &#8220;GirisYap&#8221; metodu \u00e7a\u011fr\u0131ld\u0131\u011f\u0131 zaman y\u00f6nlendirme i\u015flemi olmadan sayfas\u0131 a\u00e7\u0131lacakt\u0131r.Aksi taktirde, &#8220;0&#8221; diye de\u011fi\u015ftirip, projeyi ba\u015flat\u0131rsak e\u011fer, &#8220;GirisYap&#8221; metodunu \u00e7a\u011f\u0131rd\u0131m zaman, Kontrol sayfas\u0131na y\u00f6nlendirecektir.<\/p>\n<p>E\u011fer, bir Controller s\u0131n\u0131f\u0131 i\u00e7inde b\u00fct\u00fcn metodlara g\u00fcvenlik almak istiyorsak, hepsine teker teker attribute tan\u0131mlayaca\u011f\u0131m\u0131za Class&#8217;a bir kere tan\u0131mlamam\u0131z yeterli olacakt\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    &#x5B;GirisGuvenligi]\r\n    public class GirisController : Controller\r\n    {\r\n       ...\r\n    }\r\n<\/pre>\n<p>Bu yaz\u0131m\u0131z\u0131nda sonuna gelmi\u015f bulunmaktay\u0131z.Faydalanman\u0131z dile\u011fiyle..<br \/>\nBir sonraki yaz\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere..<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar:)<\/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>Bu yaz\u0131mda, genellikle kontrol ve do\u011frulama i\u015flemlerinde kullan\u0131lan attribute kavram\u0131n\u0131 ve attribute olu\u015fturmay\u0131 irdeleyece\u011fiz.Attribute, metod kavram\u0131nda oldu\u011fu gibi, bir kere yaz her yerde kullan d\u00fc\u015f\u00fcncesiyle geli\u015ftirilmi\u015f yap\u0131lard\u0131r.<!-- 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":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11],"tags":[746,313,283],"class_list":["post-1153","post","type-post","status-publish","format-standard","hentry","category-asp-net-mvc","tag-asp-net-mvc","tag-attribute","tag-mvc"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/1153","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=1153"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/1153\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=1153"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=1153"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=1153"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}