2009-04-15 35 views
6

Hedef URL'yi değiştirmeden: bağlı www.mysite.com/NewYork YA www.mysite.com/name-of-businessASP MVC Yönlendirme (yönlendirme)

: Ben URL'yi yazın isterler string URL'yi değiştirmeden farklı eylemlere yönlendirmek istiyorum. denetleyici olarak

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.MapRoute(
     "UrlRouter", // Route name 
     "{query}", // URL with parameters 
     new { controller = "Routing", action = "TestRouting" } // Parameter defaults 
    ); 
} 

Ben:

Şimdiye kadar var ben çok fazla URL'yi değiştirmeden olmadan sayfaya/transferini yönlendirmek için her şeyi denedim

public ActionResult TestRouting(string query) 
{ 
    if (query == "NewYork") 
     return RedirectToAction("Index", "Availability"); // <--------- not sure 
    else if (query == "name-of-business") 
     return Redirect("nameofbusines.aspx?id=2731");  // <--------- not sure 
    else 
     return RedirectToAction("TestTabs", "Test");   // <--------- not sure 
} 

, ama her şey URL değişiklikleri denedim veya bana bir hata verir.

Temel olarak, URL'yi saklayabildiğim ancak eyleme bilgi gönderebildiğim ve sonucunu görüntüleyebildiğim server.transfer eşdeğerini arıyorum.

+0

Aslında tam olarak aradığım şeyi buldum. Onun biraz karmaşık ama kurduktan hemen sonra, çok fazla uçuşu anında gerçekleştirebilirsiniz. Cevabımı yakında yayınlayacağım, bu proje çok kaba! – CesarHerrera

cevap

0

"www.mysite.com/NewYork" adresine gidip "gerçekten" "başka bir yere" gitmeyi, ancak URL'yi yalnız bırakmak istediğinizi mi söylüyorsunuz? Belki de yapmak istediğiniz şey, bunu uygulamak için kısmi görüşler kullanmaktır? Bu şekilde, temel sayfanız yönlendirilen şey olabilir ve ardından bu sayfanın içinde farklı kısmi görünümler getirmek için durumunuzu test edersiniz? Uygulamamda, bir kılavuzun salt okunur bir sürümünü veya düzenlenebilir bir ızgarayı görüntülemek için yaptım. Çok güzel çalıştı.

+0

Yapmak istediğim, farklı işlemler yapmak için www.mysite.com/NewYork ve www.mysite.com/BusinessName adresine sahip olmak. Biri, işleri ele alan yerleri ve diğerini ele alır. AMA, aynı zamanda URL'yi sağlam tutar. – CesarHerrera

5

Bu konuda Nick'le birlikteyim, ancak kısmi olarak yapmak yerine normal görünümleri kullanabileceğinizi düşünüyorum. Denetleyiciye karşılık gelen görünümlerde değilse, bunları paylaşılan görünümler olarak uygulamanız gerekebilir (çünkü yalnızca ilişkili ve paylaşılan görünümlere bakacaktır).

public ActionResult TestRouting(string query) 
{ 
    if (query == "NewYork") 
    { 
     var model = ...somehow get "New York" model 
     return View("Index", model); 
    } 
    else if (query == "name-of-business") 
    { 
     var model = ...get "nameofbusiness" model 
     return View("Details", model); 
    } 
    else 
    { 
     return View("TestTabs"); 
    } 
} 

Her görünüm daha sonra modelin belirli bir örneğini almak ve onu modelini kullanarak içeriği var hale getirecektir. URL değişmeyecek.

Bir Yönlendirme Sonucu kullandığınız her zaman, aslında tarayıcıya bir HTTP yönlendirmesi gönderiyor olacaksınız ve bu da bir URL değişikliğini zorlayacaktır.

+0

Sanırım burada ne söylediğinizi görüyorum, temel olarak görüşlerin paylaşılmasını sağlayın ve görüntüyü döndürün ve görünüm bilgilerini modelden geçirin. Bu muhtemelen yapılabilir, ancak ne yazık ki ben emmek ve model kullanmadı, ben ViewData aracılığıyla birkaç şey iletmek. – CesarHerrera

+0

başka bir answe bulamıyorum, ancak bir yön bulmayı umuyordum, ancak işleri yapabilmeleri için parametreleri yalnızca parametrelerle arayabiliyorum, ancak bu bir tutam üzerinde çalışabilir. – CesarHerrera

+0

Ah yea, aynı zamanda paylaşımlı olarak daha fazla görüntüleme oluşturmak zorunda kalmamanın bir yolunu bulmayı da ümit ediyordu, sadece mevcut olanları kullan, bu mümkün olup olmadığından emin değil. – CesarHerrera

0

Ben .aspx sayfasına yönlendirme konusunda ne yapabilirim emin değilim, ama böyle bir şey ile RedirectToAction(...)s yerine mümkün olmalıdır: Bu çalıştı eğer

public ActionResult TestRouting(string query) 
{ 
    if (query == "NewYork") 
    { 
     var controller = new AvailabilityController();   
     return controller.Index(); 
    } 
    else if (query == "name-of-business") 
     return Redirect("nameofbusines.aspx?id=2731");  <--------- not sure 
    else 
    { 
     var controller = new TestController();   
     return controller.TestTabs(); 
    } 

} 
+0

Cevabınız için teşekkürler, ancak ne yazık ki: var controller = new TestController(); dönüş kontrolörü. TestTabs(); da çalışmıyor, Gerçek eylemi çağırıyor, ancak görüntülemek istediğim sonuç görüntülerini döndürmüyor. Görüntüleme html'ini göstermek için neler yapabileceğimi merak ediyorum – CesarHerrera

0

Im emin değilim yol veya bu şekilde herhangi bir dezavantajları varsa ..

Projenize global.asax dosyası ekleyin. Bu aşağıdaki yöntemi ekleyin:.

void Application_BeginRequest(object sender, EventArgs e) 
{ 
    // Handles all incoming requests 
    string strURLrequested = Context.Request.Url.ToString(); 
    GetURLToRedirect objUrlToRedirect = new GetURLToRedirect(strURLrequested); 
    Context.RewritePath(objUrlToRedirect.RedirectURL); 
} 

GetURLToRedirect yazmış URL'sini temel Gerçek adresi bulmak için mantık olan bir sınıf olabilir [RedirectURL] mülkiyet altında yönlendirmek için bir URL ile ayarlanacaktır sayfalar.

Bu yardımcı olur umarım ...

2

Böyle Denetleyicinizi değiştirebilirsiniz:

public ActionResult TestRouting(string query) 
{ 
    string controller,action; 

    if (query == "NewYork") 
    { 
     controller = "Availability"; 
     action = "Index"; 
    } 
    else 
    { 
     controller = "Test"; 
     action = "TestTabs"; 
    } 

    ViewBag.controller = controller; 
    ViewBag.action = action; 

    return View(); 
} 

Sonra bu gibi görünümde bu ViewBags kullanabilirsiniz: bu kadar

@{ 
    Layout = null; 
    Html.RenderAction(ViewBag.action, ViewBag.controller); 
} 

. Ve bu örneği bir sınıf ve bazı işlevler kullanarak geliştirebilirsiniz.