9

ASP.Net Core ve MVC 6 ile FragSwapper.com web sitemi yeniden yazıyorum (şu anda Asp 2.0'de!) Ve normalde sahip olduğum bir şeyi yapmaya çalışıyorum db kodu ve bazı Yönlendirmeler ile birlikte bir URL Re-Write aracı kırmak için ama ASP.Net Core muhtemelen MVC Yönlendirme ve Yönlendirme ile yapmak için "daha iyi" bir yol olup olmadığını bilmek istiyorum. Ne yapmalı [root]MVC ve ASP.Net Core ile dinamik url yeniden yazma

: Burada

siteyi erişme

  • URL ... benim senaryolar vardır zamanki [Ana] Kontrolör ve git [ Dizin] Görüntüle (no [ID]). ... Bu şimdi yapar: [root]/ControllerName/... laf kalabalığı ...

    Ne yapmalı: Git

    app.UseMvc(routes => 
    { 
        routes.MapRoute(
        name: "default", 
        template: "{controller=Home}/{action=Index}/{id?}"); 
    }); 
    
  • URL sitesini Erişme Kontrolöre, vb ... tüm bu da çalışır.

  • zor bir site: Erişme URL: Bir Olay Kimliği bulursanız Erişim veritabanı ve karar vermek için bazı mantık yapın: [root]/SomeString Ne yapmalı

    . Eğer [Event] Controller'a ve [Index] View'a ve bulduğum her şeyin bir [ID] bölümüne gidersem. Aksi takdirde bir Host ID bulmaya çalışıyorum ve [Home] Controller'a ve [Organization] View seçeneğine gidin. Bulamıyorsam ve Event veya Host olağan [Home] Controller'a ve [Index] View'a (no [ID]) gider.

Buradaki en büyük özellik, 2 farklı denetleyicide tamamen farklı üç farklı görünümden birine yönlendirmek istediğim.

Yani, kullanıcı sitemin köküne geldiğinde ve üzerinde tek bir "/ Something" olduğunda ve mantığın veritabanıyla çalıştırıldığı zaman, bir mantık yapmak istiyorum.

Soruyu anlıyorsanız, şimdi okumayı durdurabilirsiniz ... Tüm bu mantığın neden gerekli olduğunu anlamanız gerektiğini düşünüyorsanız, daha ayrıntılı bir bağlam için okumaya devam edebilirsiniz.

Sitemde iki mod vardır: Bir Etkinliği Görüntüleme ve Olayını Görüntüleme! Genellikle bir seferde çalışan 4 veya 5 olay vardır, ancak çoğu kullanıcı yalnızca bir etkinlikle ilgilenir, ancak her 4 ayda bir FARKLI bir olay 'dur. [Host] öğesi var ve her Ana Bilgisayar 4'e kadar saklar. Olaylar yılda bir, birer birer. Çoğu kullanıcı sadece bir Host kullanıcısının olaylarını önemser.

Bir kullanıcı her zaman bir olay haritaya giderek bulmak olay ve ben (ücretsiz) bir harita gösterebilir kaç kez bir sınırı vardır çünkü üzerine tıklayın yapmaktan kaçınmaya çalışıyorum ve gerçekten var gerekli değil. kullanıcının% 99,99'unun sitemde olması, bir Etkinlik ekranında, Evim ekranlarında değil, aynı anda yalnızca bir etkinlikle ilgileniyor. gelecekteki web siteme gelirlerse, onlar için etkinliğine veya favori ana bilgisayarlarından yeni bir etkinliğe gitmeleri için kod yazmak istiyorum. Bu yüzden çok sayıda tıklamayı önleyebilir ve [Ev] denetleyici sayfalarını yeniler için odaklayabilirim ... ama ben henüz otomatik oturum açma çalışmasına sahip değil, bu yüzden arka brülörde.

Ama şimdilik barındıran her zaman onların olaylar için aynı url sahip olmak istiyorum: FragSwapper.com/[Host Kısaltma] ... ve her zaman farklı bir kimliğinin olduğunu mevcut olaya gidecek biliyorum her 4 ay !!!

Çılgın ... Biliyorum ... ama teknik olarak çok kolay, bilmiyorum Nasıl yapıldığını MVC'de nasıl düzgün yapmalıyım.

cevap

14

Güncelleme: ASP.Net Çekirdek 1.1

release notes göre, yeni RewriteMiddleware oluşturuldu.

Bu, bir kaç farklı önceden tanımlanmış yeniden yazma seçeneği ve yardımcı uzantı yöntemleri sunar; bu, bu yanıtta yapıldığı gibi istek yolunu değiştirebilir. Özellikle OP soruya örneğin RewriteRule

uygulanmasını bakın, siz (sıfırdan veya bir regex dayanmaktadır RewriteRule gibi varolan bir, uzayan ya) kendi IRule sınıf uygulamak gerekir. Muhtemelen RewriteOptions için yeni bir AddMyRule() uzantı yöntemiyle tamamlarsınız.


Sen middleware kendi oluşturmak ve MVC yönlendirme öncesi istek boru hattına ekleyebilirsiniz.

Bu, MVC yolları değerlendirilmeden önce kodunuzu boru hattına enjekte etmenizi sağlar. Sizin mümkün olacaktır Bu şekilde:

  1. gelen isteğin yolu incelenmesi
  2. aynı değerde
  3. bir eventId veya hostid veritabanında
  4. etkinliği ara veya ana bulunsaydı, gelen güncelleme Event/Index/{eventId} ya da Home/Organization/{hostId} ya da
  5. yolunu izleyerek sonraki ara katman (MVC yönlendirme) isteğini yerine getirsin. Bunlar, önceki katman Örneğin

, veritabanında bir eventId karşı gelen istek yolunu maç çalışır create your ownEventIdUrlRewritingMiddleware katman tarafından yapılan istek yolundaki herhangi bir değişiklik görecekti. eşleşti, bu Event/Index/{eventId} orijinal istek yolunu değişecek:

public class EventIdUrlRewritingMiddleware 
{ 
    private readonly RequestDelegate _next;   

    //Your constructor will have the dependencies needed for database access 
    public EventIdUrlRewritingMiddleware(RequestDelegate next) 
    { 
     _next = next; 
    } 

    public async Task Invoke(HttpContext context) 
    { 
     var path = context.Request.Path.ToUriComponent(); 

     if (PathIsEventId(path)) 
     { 
      //If is an eventId, change the request path to be "Event/Index/{path}" so it is handled by the event controller, index action 
      context.Request.Path = "/Event/Index" + path; 
     } 

     //Let the next middleware (MVC routing) handle the request 
     //In case the path was updated, the MVC routing will see the updated path 
     await _next.Invoke(context); 

    } 

    private bool PathIsEventId(string path) 
    {    
     //The real midleware will try to find an event in the database that matches the current path 
     //In this example I am just using some hardcoded string 
     if (path == "/someEventId") 
     { 
      return true; 
     } 

     return false; 
    } 
} 

Sonra aynı yaklaşımı aşağıdaki başka bir sınıf HostIdUrlRewritingMiddleware oluşturun.

Nihayet hale Startup.Configure yöntemde boru hattına yeni ara katman eklemek onlar Yönlendirme ve MVC katman önce eklenir emin:

  • / gider: Bu yapılandırma ile

     app.UseMiddleware<EventIdUrlRewritingMiddleware>(); 
         app.UseMiddleware<HostIdUrlRewritingMiddleware>(); 
         app.UseMvc(routes => 
         { 
          routes.MapRoute(
           name: "default", 
           template: "{controller=Home}/{action=Index}/{id?}"); 
         }); 
    

    HomeController.Index eylem

  • /Home/AboutHomeController.About eylemine gider
  • /Event/Index/1
  • /someEventId 1, EventController.Index eyleme gider = EventController.Index eylem id gider id = someEventId

hiçbir http yer yönlendirmeleri vardır unutmayın. Tarayıcıda /someEventId açıldığında, tek bir http isteği vardır ve tarayıcı, eklenti çubuğunda /someEventId gösterecektir. (Orijinal yol güncellenmiş olsa bile)

+0

Bu kesinlikle bir cevapta beklediğimden daha fazlaydı ve konsept kesinlikle ihtiyaç duyduğum şeydi! İçeri girmenin bir yolu olmalı diye düşündüm, sadece nereye bakacağımı bilmiyordum. Hala onunla oynuyordum, ama hiç şüphem yok ki ortadaki mal (benim için tamamen bilinmeyen bir kavramdı) benim yapmam gereken şey. En büyük problemi .Net Core ile oynayarak buluyorum. Yeteri kadar insan zaten benimle aynı sorunları yaşamadı ve bana bakmak için çok az yer verdi. Zaman ayırdığınız için çok teşekkürler. –

+0

Hiç sorun değil! Çerçeve ile ilgili olarak, tamamen size katılıyorum, asp.net çekirdeğinde birçok şey değişti ve bazen etrafta yolunuzu bulmak zor. Şüphelendiğimde [docs] 'dan (https://docs.asp.net/en/latest/) başlamayı deniyorum, ancak burada bile henüz ele alınmayan pek çok konu var. –

+0

Orta yazılımı MVC'den önce mi, sonra mı eklediniz? Ve bir sonraki çağırmadan önce yolu değiştirir misin? Hangi yolu ayarlıyorsunuz ve kontrol edeceği kontrol ve rota nedir? Kodunuzu görmeden bilmek zor, ancak yukarıdaki cevap yeni bir 1.0.1 uygulamasında iyi çalışıyor. Belki yeni bir boş uygulamayı deneyin ve yavaşça kodunuzu eklemeye başlayın, eğer hala sorun yaşıyorsanız yeni bir soru açmaya değebilir! (Ayrıca [bu makale] (http://www.dotnetcurry.com/aspnet/1312/aspnet-core-request-pipeline-vanity-url) yazdım, (aynı fikir üzerinde genişletir) ayrıca bulabilirsiniz. –