Asp.Net Mvc Routing ile tamamıyla özel url yapısı nasıl oluşturabilirim?

446 views
Skip to first unread message

Sarp Kayaç

unread,
Jun 6, 2009, 3:36:34 PM6/6/09
to altdotne...@googlegroups.com
Merhabalar,

Mvc ile proje geliştirmek istiyorum yalnız klasik asp.net ile yaptığım bazı şeyleri yapmayı bilmediğimden bir türlü geçiş yapamıyorum. İstediğim url yapısı şu şekilde olacak.

example.com/yazi1/
example.com/yazi1/yazi2.html
example.com/yazi3

Yani bağlantı yapısı hiç bir şekilde sisteme ne yapacağını söylemeyecek. Ben veritabanından çekip eğer /yazi1/yazi2.html adresi istenildiyse 2 numaralı yazıyı göstereceğim kullanıcıya. Yada /yazi3 adresi istenildiyse bu sefer 3 numaralı yazıyı göstereceğim.

Normalde RewritePath ve HttpModule kullanarak bu istediğimi yapabiliyorum. Mvc ile nasıl yapabilirim yol gösterirseniz sevinirim. İstediğim bağlantıyı istediğim controllera göndermek istiyorum. Kendisi otomatik yönlendirmesin, kendim yapayım istiyorum.

Huseyin Tufekcilerli

unread,
Jun 6, 2009, 3:50:23 PM6/6/09
to altdotnetturkiye
MSDN sayfasında "Handling a Variable Number of Segments in a URL
Pattern" diye bir bölüm var:

http://msdn.microsoft.com/en-us/library/cc668201(VS.100).aspx#handling_a_variable_number_of_segments_in_a_url_pattern

bunu mu yapmaya çalışıyorsun? Böylelikle değişken yapıdaki URL'leri
belirlediğin tek bir controller üzerindeki bir metoda (action)
yönlendirir ve ona gelen tek parametredeki değişken URL kısmını parse
ederek istediğin veriyi View'a gönderebilirsin.

Sarp Kayaç

unread,
Jun 6, 2009, 4:29:08 PM6/6/09
to altdotne...@googlegroups.com
Tek istediğim tüm url yi parametre olarak alıp kendi istediğim View'a yönlendirmek. Verdiğiniz adreste her slash ("/") işaretini ayrı ayrı parametre olarak kabul etmekte. 

Url yapısı hangi controllera gitmesi gerektiğini söylemesin ben kendim söyleyeyim istiyorum açıkçası. 

Belki ayrı ayrı parametre alaraktanda çözümleyebilirim ama hepsini tek seferda almayı tercih ederdim.

06 Haziran 2009 Cumartesi 22:50 tarihinde Huseyin Tufekcilerli <huse...@gmail.com> yazdı:

ercü eser

unread,
Jun 6, 2009, 6:56:14 PM6/6/09
to altdotne...@googlegroups.com
Yapmak istedigin birden fazla controller gerektirmiyor yalniz. Sadece controller ile url yapisini e$le$tirmelisin.

Entries diye bir controllerimiz olsun, Show diye bir actionumuz olsun ilgili yaziyi ekrana basan.

Eger istedigin /yazi1/yazi2.html ve /yazi2.html seklinde olunca her zaman yazi2'yi ekrana basmasi ise

route'nin en basina sirayla sunlari yazmalisin:

routes.MapRoute(null, "{onemsizyazi}/{yazi}", new { controller = "Entries", action = "Show" }));
routes.MapRoute(null, "{yazi}", new { controller = "Entries", action = "Show" }));

daha sonra EntriesController'da Show actionunda

public ActionResult Show(string yazi)
{

myEntry = _EntriesRepository.GetbyName(yazi);
return View(
myEntry);

}

ile ilgili yaziyi ekrana basabilirsin.


Elindeki rewritepath dosyasini verirsen tam karsiligini soyleyebilirim.




2009/6/6 Sarp Kayaç <sarp...@gmail.com>



--
Ercu ESER
http://twitter.com/ercu
http://www.ercueser.com

Sarp Kayaç

unread,
Jun 7, 2009, 7:12:23 AM6/7/09
to altdotne...@googlegroups.com

Adresine httpModule BeginRequest olayını gönderdim. Kısaca açıklamam gerekirse 
İstenilen parametreli adresi "parametreliSayfaAdresi" değişkenine atıyorum. Sonrasında spSayfaSanalAdresineGoreSayfaGercekAdresiGetir  stored procedure'ini çağırıp nereye yönlenmesi gerektiğini öğreniyorum. Veritabanında adres tanımlandıysa tanımlı adrese RewritePath ile yönlendirme yapıyorum. Tanımlı değilse 404 hata kodunu verip yanıtı sonlandırıyorum.

Örneklendirecek olursam;
/yazi1/ ==> /Default.aspx?y=1
/yazi1/yazi2.html ==> /Default.aspx?y=2
/yazi3/ ==> /Default.aspx?y=3
/yazi2.html ==> /Default.aspx?y=4
/yazi3/hede/hodo.html ==> /Default.aspx?y=5

Bu sayede istediğim gibi kullanıcı dostu bağlantılar oluşturabiliyorum.

Ayrıca /yazi2.html istenildiğinde gene 2 numaralı yazıyı göstermek istemiyorum. /yazi2.html 4 numaralı yazıya işaret edebilir. Bu tamamen veritabanında tanımlı gerçek adrese bakar

07 Haziran 2009 Pazar 01:56 tarihinde ercü eser <ercu...@gmail.com> yazdı:

ercü eser

unread,
Jun 7, 2009, 10:23:54 AM6/7/09
to altdotne...@googlegroups.com
O kadar cok cozumu var ki bunun hangisi aklina yatarsa onu yapabilirsin.

1- Yukarida soyledigimi soyle kullanirsin:


routes.MapRoute(null, "{yazi}", new { controller = "Entries", action = "Show" }));

routesini yazarak IModelBinderdan tureyen bir adet custom model binder yaparsin. Buna yazi stringini verip, sayfanin gercek adresini alarak default.aspx?y=1  deki "y" degerini cekersin once. Daha sonra o id'deki yazi modelini dondurursun.

Kod olarak oldukca basit aslinda ama yazamazsan yardimci olurum.

2- Application_BeginRequest'i aynen mvcde kullanabilirsin. Rewritepath, Route'lerden once calisiyorsa sorun cikmaz. Bununla birlikte Dbdeki kayitlarin default.aspx?y=1 seklinde oldugu icin soyle bir route eklemelisin:

routes.MapRoute(null, "default.aspx?y={yazi}", new { controller = "Entries", action = "Show" }));


3- Route Register'de dbdeki tum kayitlari route entry olarak ekleyebilirsin.

 public static void RegisterRoutes(RouteCollection routes)
{
RouteHelper.RegisterRoutesFromDB(routes);
RegisterRoutesFromDB, veritabanindaki gercek-sanal adres eslestirmelerini alarak routelere bunu ekleyecek.

2009/6/7 Sarp Kayaç <sarp...@gmail.com>

Sarp Kayaç

unread,
Jun 7, 2009, 12:59:58 PM6/7/09
to altdotne...@googlegroups.com
3 yöntemide test ettim.

1. yöntem en güzeli gibi duruyor. Yalnız birinci yöntemi test ettiğimde sadece example.com/yazi1 bağlantısını yakalayabiliyor. example.com/yazi1/yazi2 dediğim zaman Show olayına düşmüyor. Hiçbir route ile eşleşmedi diye hata veriyor.

3. yöntem ise sanki biraz ram canavarıymış gibime geliyor :) Ayrıca route'lar sadece uygulama başlangıcında set edileceğinden veritabanında yaptığım değişiklikler iis e restart atmadan veya uygulamayı baştan başlatmadan işlemeyecektir diye düşünüyorum. 

2. yöntemi en son denedim. RewritePath route'tan önce çalışıyor. Bu sayede yazi değişkenine yazı numarası düzgün bir biçimde geldi. 

Not: Route tanımlarken ? (soru işareti) kullanılamıyor. O yüzden soru işaretini kaldırmak durumunda kaldım.

Tüm cevaplar için teşekkürler.


07 Haziran 2009 Pazar 17:23 tarihinde ercü eser <ercu...@gmail.com> yazdı:
Reply all
Reply to author
Forward
0 new messages