﻿
{"id":6597,"date":"2017-06-28T04:16:06","date_gmt":"2017-06-28T04:16:06","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=6597"},"modified":"2017-06-28T04:16:06","modified_gmt":"2017-06-28T04:16:06","slug":"system-argumentexception-cannot-call-action-method-system-collections-generic-list1a-xasystem-func2asystem-boolean-on-controller-xxx-because-the-action-method-is-a-generic-method","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/system-argumentexception-cannot-call-action-method-system-collections-generic-list1a-xasystem-func2asystem-boolean-on-controller-xxx-because-the-action-method-is-a-generic-method\/","title":{"rendered":"System.ArgumentException: &#8216;Cannot Call Action Method &#8216;System.Collections.Generic.List`1[A] X[A](System.Func`2[A,System.Boolean])&#8217; On Controller &#8216;XXX&#8217; Because The Action Method Is a Generic Method.&#8217; Hatas\u0131 ve \u00c7\u00f6z\u00fcm\u00fc"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Asp.NET MVC mimarisinde projenizi in\u015fa ederken, olu\u015fturulan adreslerin \u015fablonlar\u0131n\u0131 RouteConfig.cs dosyas\u0131 yerine <a href=\"http:\/\/www.gencayyildiz.com\/blog\/asp-net-mvc-5-attribute-ile-routing-yonlendirmesiattribute-routing\/\" target=\"_blank\" rel=\"noopener noreferrer\">Route Attribute<\/a> \u00f6zelli\u011fini kullanarak yapmay\u0131 tercih etti\u011finiz durumda sizi kar\u015f\u0131layacak olan olas\u0131 bir hata \u00fczerine konu\u015fuyor olaca\u011f\u0131z. Bu olas\u0131 hata, &#8220;olas\u0131&#8221; kelimesini vurgulad\u0131\u011f\u0131m gibi her durumda ceyran etmeyen, yap\u0131sal olarak \u00f6zel bir in\u015fa ve teknik kullan\u0131ld\u0131\u011f\u0131 durumda kar\u015f\u0131la\u015f\u0131labilen hususi bir durumu te\u015fkil etmektedir. \u00d6ncelikle hatam\u0131z\u0131n ne oldu\u011funu ele alal\u0131m, ard\u0131ndan nas\u0131l bir durumda al\u0131nd\u0131\u011f\u0131na de\u011findikten sonra kar\u015f\u0131la\u015f\u0131lan bu olas\u0131 hataya nas\u0131l \u00e7\u00f6z\u00fcm getirebilece\u011fimizi konu\u015fal\u0131m.<\/p>\n<p>Hatam\u0131z;<\/p>\n<blockquote>\n<p style=\"text-align: center;\"><strong><em><span style=\"color: #ff0000;\">&#8216;Cannot call action method &#8216;System.Collections.Generic.List`1[A] SartliVeriGetir[A](System.Func`2[A,System.Boolean])&#8217; on controller &#8216;WebApplication38.Controllers.HomeController&#8217; because the action method is a generic method.&#8217;<\/span><\/em><\/strong><\/p>\n<\/blockquote>\n<p>\u015feklindedir.<br \/>\nHatam\u0131z\u0131n g\u00f6rsel halinide g\u00f6rmek icap ederse e\u011fer;<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2017\/06\/system-argumentexception-cannot-call-action-method-system-collections-generic-list1a-xasystem-func2asystem-boolean-on-controller-xxx-because-the-action-method-is-a-generic-method.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2017\/06\/system-argumentexception-cannot-call-action-method-system-collections-generic-list1a-xasystem-func2asystem-boolean-on-controller-xxx-because-the-action-method-is-a-generic-method.png\" alt=\"System.ArgumentException: &#039;Cannot Call Action Method &#039;System.Collections.Generic.List`1[A] X[A](System.Func`2[A,System.Boolean])&#039; On Controller &#039;XXX&#039; Because The Action Method Is a Generic Method.&#039; Hatas\u0131 ve \u00c7\u00f6z\u00fcm\u00fc\" width=\"387\" height=\"107\" class=\"aligncenter size-full wp-image-6601\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2017\/06\/system-argumentexception-cannot-call-action-method-system-collections-generic-list1a-xasystem-func2asystem-boolean-on-controller-xxx-because-the-action-method-is-a-generic-method.png 387w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2017\/06\/system-argumentexception-cannot-call-action-method-system-collections-generic-list1a-xasystem-func2asystem-boolean-on-controller-xxx-because-the-action-method-is-a-generic-method-300x83.png 300w\" sizes=\"auto, (max-width: 387px) 100vw, 387px\" \/><\/a><br \/>\nbuyrun bu \u015fekildedir.<\/p>\n<h4>Bu Hata Hangi Durumda Al\u0131nmaktad\u0131r?<\/h4>\n<p>Asp.NET MVC mimarisinde, controller s\u0131n\u0131flar\u0131n\u0131n t\u00fcretilece\u011fi ve \u00e7o\u011fu veritaban\u0131 modifikasyon i\u015flemleriyle beraber t\u00fcm yap\u0131lanmada ortak olacak metot, property vs. ile birlikte di\u011fer \u00e7al\u0131\u015fmalar\u0131 bar\u0131nd\u0131ran &#8220;BaseClass(Controller).cs&#8221; olarak nitelendirebilece\u011fimiz s\u0131n\u0131f\u0131, kendisini ve i\u00e7erisindeki yap\u0131lar\u0131 Generic bir \u015fekilde in\u015fa ederek projenin senaryosuna dahil ediyorsan\u0131z ve t\u00fcm bunlar\u0131n yan\u0131nda route mekanizmas\u0131nda Route Attribute \u00f6zelli\u011fi ile \u00e7al\u0131\u015fma ger\u00e7ekle\u015ftiriyorsan\u0131z bu hatayla kar\u015f\u0131la\u015fma ihtimaliniz olacakt\u0131r. Olacakt\u0131r diyorum \u00e7\u00fcnk\u00fc a\u015fa\u011f\u0131da da bu bahsetti\u011fim yakla\u015f\u0131mla beraber hata pozisyonunu ele ald\u0131\u011f\u0131m\u0131z \u00f6rnekte g\u00f6zden ka\u00e7\u0131rd\u0131\u011f\u0131m\u0131z bir noktadan dolay\u0131 bu hatan\u0131n meydana geldi\u011fini g\u00f6receksiniz.<\/p>\n<p>\u00d6rnek olarak a\u015fa\u011f\u0131daki &#8220;BaseClass(Controller).cs&#8221; s\u0131n\u0131f\u0131n\u0131 ele alal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class BaseClassController&lt;T&gt; : Controller where T : class, new()\r\n    {\r\n        private NorthwindEntities db = new NorthwindEntities();\r\n        public NorthwindEntities VeriTabani\r\n        {\r\n            get\r\n            {\r\n                return db;\r\n            }\r\n        }\r\n        public List&lt;T&gt; SartliVeriGetir(Func&lt;T, bool&gt; Metod)\r\n        {\r\n            return db.Set&lt;T&gt;().Where(Metod).ToList();\r\n        }\r\n        public List&lt;A&gt; SartliVeriGetir&lt;A&gt;(Func&lt;A, bool&gt; Metod) where A : class, new()\r\n        {\r\n            return db.Set&lt;A&gt;().Where(Metod).ToList();\r\n        }\r\n        public List&lt;T&gt; TumVerileriGetir()\r\n        {\r\n            return db.Set&lt;T&gt;().ToList();\r\n        }\r\n        public List&lt;A&gt; TumVerileriGetir&lt;A&gt;() where A : class, new()\r\n        {\r\n            return db.Set&lt;A&gt;().ToList();\r\n        }\r\n    }\r\n<\/pre>\n<p>\u0130\u015fte bu &#8220;BaseClass&#8221;\u0131 kullanarak a\u015fa\u011f\u0131daki &#8220;Home(Controller).cs&#8221; misali t\u00fcm controller s\u0131n\u0131flar\u0131m\u0131z\u0131 t\u00fcretti\u011fimizi d\u00fc\u015f\u00fcnelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class HomeController : BaseClassController&lt;FormCollection&gt;\r\n    {\r\n        public ActionResult Index()\r\n        {\r\n            \/\/.\r\n            \/\/. Di\u011fer i\u015flemler\r\n            \/\/.\r\n            return View();\r\n        }\r\n    }\r\n<\/pre>\n<p>Bu i\u015flemlerden sonra yukar\u0131larda da bahsetti\u011fimiz gibi Route Attribute \u00f6zelli\u011fi i\u00e7in &#8220;App_Start&#8221; klas\u00f6r\u00fcndeki RouteConfig s\u0131n\u0131f\u0131nda bulunan RegisterRoutes metoduna da a\u015fa\u011f\u0131daki gibi &#8220;MapMvcAttributeRoutes&#8221; metodunu ekleyelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class RouteConfig\r\n    {\r\n        public static void RegisterRoutes(RouteCollection routes)\r\n        {\r\n            routes.IgnoreRoute(&quot;{resource}.axd\/{*pathInfo}&quot;);\r\n            routes.MapMvcAttributeRoutes();\r\n            routes.MapRoute(\r\n                name: &quot;Default&quot;,\r\n                url: &quot;{controller}\/{action}\/{id}&quot;,\r\n                defaults: new { controller = &quot;Home&quot;, action = &quot;Index&quot;, id = UrlParameter.Optional }\r\n            );\r\n        }\r\n    }\r\n<\/pre>\n<p>Burada hata durumunu \u00f6rneklendirdi\u011fimizden dolay\u0131 bir web projesiyle ilgili di\u011fer t\u00fcm \u00e7al\u0131\u015fmalar\u0131n yap\u0131ld\u0131\u011f\u0131n\u0131 varsayarak projemizi derleyip \u00e7al\u0131\u015ft\u0131ral\u0131m ve olas\u0131 hatam\u0131z taraf\u0131ndan a\u015fa\u011f\u0131daki gibi kar\u015f\u0131lanal\u0131m&#8230;<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2017\/06\/system-argumentexception-cannot-call-action-method-system-collections-generic-list1a-xasystem-func2asystem-boolean-on-controller-xxx-because-the-action-method-is-a-generic-method-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2017\/06\/system-argumentexception-cannot-call-action-method-system-collections-generic-list1a-xasystem-func2asystem-boolean-on-controller-xxx-because-the-action-method-is-a-generic-method-1.png\" alt=\"System.ArgumentException: &#039;Cannot Call Action Method &#039;System.Collections.Generic.List`1[A] X[A](System.Func`2[A,System.Boolean])&#039; On Controller &#039;XXX&#039; Because The Action Method Is a Generic Method.&#039; Hatas\u0131 ve \u00c7\u00f6z\u00fcm\u00fc\" width=\"660\" height=\"245\" class=\"aligncenter size-full wp-image-6610\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2017\/06\/system-argumentexception-cannot-call-action-method-system-collections-generic-list1a-xasystem-func2asystem-boolean-on-controller-xxx-because-the-action-method-is-a-generic-method-1.png 660w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2017\/06\/system-argumentexception-cannot-call-action-method-system-collections-generic-list1a-xasystem-func2asystem-boolean-on-controller-xxx-because-the-action-method-is-a-generic-method-1-300x111.png 300w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><\/a><br \/>\n\u0130\u015fte&#8230; G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi bu tarz bir &#8220;BaseClass&#8221; yakla\u015f\u0131m\u0131nda ilgili hata taraf\u0131ndan uyar\u0131lmaktay\u0131z. Hadi gelin \u015fimdi bu uyar\u0131lman\u0131n neden kaynakland\u0131\u011f\u0131n\u0131 tan\u0131mlayal\u0131m ve nas\u0131l \u00e7\u00f6z\u00fclece\u011fini ele alal\u0131m.<\/p>\n<h4>Hatan\u0131n \u00c7\u00f6z\u00fcm\u00fc?<\/h4>\n<p>Yukar\u0131daki sat\u0131rlarda hatam\u0131z\u0131n hangi durumda meydana geldi\u011fini inceledik. \u015eimdi, \u00f6ncelik olarak hatam\u0131z\u0131n neden kaynakland\u0131\u011f\u0131n\u0131 tan\u0131mlayal\u0131m, ard\u0131ndan \u00e7\u00f6z\u00fcm\u00fc ele alal\u0131m.<\/p>\n<p>Controller s\u0131n\u0131flar\u0131m\u0131z\u0131n miras alaca\u011f\u0131 &#8220;BaseClass(Controller).cs&#8221; s\u0131n\u0131f\u0131 yukar\u0131daki \u00f6rnekte oldu\u011fu gibi generic bir yap\u0131da in\u015fa edilebilir. Bunda bir s\u0131k\u0131nt\u0131 yoktur yok olmas\u0131na lakin s\u0131n\u0131f elemanlar\u0131n\u0131n modifierlar\u0131ndan(niteleyici) birisi olduk\u00e7a \u00f6nemlidir. Bu modifier metotlar\u0131n eri\u015fim belirleyicileridir.<\/p>\n<p>&#8220;BaseClass&#8221; s\u0131n\u0131f\u0131 generic bir yap\u0131dayken Route Attribute \u00f6zelli\u011fi kullan\u0131lmaya \u00e7al\u0131\u015f\u0131l\u0131yorsa e\u011fer, &#8220;BaseClass&#8221; s\u0131n\u0131f\u0131 i\u00e7erisindeki metotlar\u0131n eri\u015fim belirleyicileri olduk\u00e7a \u00f6nem arzetmektedir. E\u011fer ki bu eri\u015fim belirleyicileri, &#8220;public&#8221; olarak se\u00e7ilirse compiler bu metotlar\u0131 bir Action Metot olarak alg\u0131layacakt\u0131r. Eee haliyle Asp.NET MVC mimarisinde generic metotlardan action metot olamayaca\u011f\u0131ndan dolay\u0131 ilgili hatam\u0131z meydana gelecektir.<\/p>\n<p>Haliyle hatam\u0131z\u0131n \u00e7\u00f6z\u00fcm\u00fc, &#8220;BaseClass&#8221; i\u00e7erisindeki t\u00fcm metotlar\u0131n eri\u015fim belirleyicilerini do\u011fru bir \u015fekilde se\u00e7mekten ge\u00e7mektedir. Bu tarz bir durumda en do\u011fru eri\u015fim belirleyicisi &#8220;protected&#8221; olabilir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class BaseClassController&lt;T&gt; : Controller where T : class, new()\r\n    {\r\n        private NorthwindEntities db = new NorthwindEntities();\r\n        public NorthwindEntities VeriTabani\r\n        {\r\n            get\r\n            {\r\n                return db;\r\n            }\r\n        }\r\n        protected List&lt;T&gt; SartliVeriGetir(Func&lt;T, bool&gt; Metod)\r\n        {\r\n            return db.Set&lt;T&gt;().Where(Metod).ToList();\r\n        }\r\n        protected List&lt;A&gt; SartliVeriGetir&lt;A&gt;(Func&lt;A, bool&gt; Metod) where A : class, new()\r\n        {\r\n            return db.Set&lt;A&gt;().Where(Metod).ToList();\r\n        }\r\n        protected List&lt;T&gt; TumVerileriGetir()\r\n        {\r\n            return db.Set&lt;T&gt;().ToList();\r\n        }\r\n        protected List&lt;A&gt; TumVerileriGetir&lt;A&gt;() where A : class, new()\r\n        {\r\n            return db.Set&lt;A&gt;().ToList();\r\n        }\r\n    }\r\n<\/pre>\n<p>Evet. \u00d6rne\u011fimiz \u00fczerinden hatan\u0131n \u00e7\u00f6z\u00fcm\u00fcn\u00fc misallendirirsek e\u011fer &#8220;BaseClass&#8221; \u00fczerinde yukar\u0131daki gibi bir de\u011fi\u015fiklik yapmam\u0131z yeterli olacakt\u0131r. Bu \u015fekilde projeyi derleyip \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131z zaman ilgili hatan\u0131n ortadan kalkt\u0131\u011f\u0131n\u0131 g\u00f6receksiniz.<\/p>\n<p>Ek olarak \u015funuda belirtmek istiyorum ki, asl\u0131nda bu hatayla kar\u015f\u0131la\u015fmak i\u00e7in illaki generic memberlar bar\u0131nd\u0131ran &#8220;BaseClass&#8221; gibi bir yap\u0131lanmaya gerek yoktur. Herhangi bir controller i\u00e7erisinde &#8220;public&#8221; eri\u015fim belirleyicisine sahip generic bir metot tan\u0131mlanm\u0131\u015fken, Route Attribute \u00f6zelli\u011finin kullan\u0131lmaya \u00e7al\u0131\u015f\u0131lmas\u0131 gene ayn\u0131 hatay\u0131 verecektir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class HomeController : BaseClassController&lt;FormCollection&gt;\r\n    {\r\n        public ActionResult Index()\r\n        {\r\n            return View();\r\n        }\r\n        public T ABC&lt;T&gt;() where T : class, new()\r\n        {\r\n            return new T();\r\n        }\r\n    }\r\n<\/pre>\n<p>misali&#8230;<\/p>\n<p>Tabi Asp.NET MVC mimarisini profesyonel anlamda kullanan hi\u00e7bir yaz\u0131l\u0131mc\u0131 bu tarz bir tan\u0131mlamay\u0131 herhangi bir controllerda yapmayaca\u011f\u0131 i\u00e7in ve \u015fahsen katiyen tavsiyede etmedi\u011fim i\u00e7in, hatan\u0131n kar\u015f\u0131la\u015f\u0131labilecek en olabilitesi y\u00fcksek durum olan &#8220;BaseClass&#8221; senaryosu \u00fczerinden sizlere bir anlat\u0131mda bulunmay\u0131 tercih etti\u011fimi bilmenizi isterim.<\/p>\n<p>Faydalanman\u0131z dile\u011fiyle&#8230;<\/p>\n<p>Sonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar dilerim&#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, Asp.NET MVC mimarisinde projenizi in\u015fa ederken, olu\u015fturulan adreslerin \u015fablonlar\u0131n\u0131 RouteConfig.cs dosyas\u0131 yerine Route Attribute \u00f6zelli\u011fini kullanarak yapmay\u0131 tercih etti\u011finiz durumda sizi kar\u015f\u0131layacak olan olas\u0131 bir hata \u00fczerine konu\u015fuyor olaca\u011f\u0131z. Bu olas\u0131 hata, &#8220;olas\u0131&#8221;&#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":3453,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11,258],"tags":[1864,1863,260,484,1083,1865],"class_list":["post-6597","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-asp-net-mvc","category-hata-cozumleri","tag-asp-net-mvc-hata","tag-baseclasscontroller","tag-hata","tag-hata-cozumu","tag-hata-ve-cozumu","tag-route-attribute"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/6597","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=6597"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/6597\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/3453"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=6597"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=6597"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=6597"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}