2012-07-17 20 views
5

डिफ़ॉल्ट अनुप्रेषित यहाँ मेरी डिफ़ॉल्ट मार्ग है:MVC मार्ग

routes.MapRouteLowercase(
       "Default", 
       "{country}/{controller}/{action}/{id}", 
       new { 
        country = "uk", 
        controller = "Home", 
        action = "Index", 
        id = UrlParameter.Optional 
       }, 
       new[] { "Presentation.Controllers" } 
       ); 

हम जानते हैं, इसके बाद के संस्करण मार्ग पर आधारित निष्पादित करने के लिए जब कोई MVC के मार्ग www.domain.com/ दौरा डिफ़ॉल्ट नियंत्रक और कार्रवाई का निर्धारण करेगा, लेकिन यूआरएल वही रहेगा। क्या www.domain.com/ से www.domain.com/uk/{controller}/{action}/ पर डिफ़ॉल्ट रूप से उपयोग किए जाने वाले प्रत्येक रूट के लिए 301 रीडायरेक्ट करने के लिए कोई अंतर्निहित या सुरुचिपूर्ण तरीका है?

+0

आप अपने डिफ़ॉल्ट नियंत्रक से रीडायरेक्ट कर सकते हैं उदा। सूचकांक कार्रवाई – codingbiz

उत्तर

14

मैंने एक कस्टम रूट हैंडलर बनाया है जो मार्ग स्तर पर रीडायरेक्ट करता है। Phil Haack के लिए धन्यवाद।

यहां पूरा काम है।

पुनर्निर्देशन मार्ग हैंडलर

public class RedirectRouteHandler : IRouteHandler 
{ 
    private string _redirectUrl; 

    public RedirectRouteHandler(string redirectUrl) 
    { 
     _redirectUrl = redirectUrl; 
    } 

    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     if (_redirectUrl.StartsWith("~/")) 
     { 
      string virtualPath = _redirectUrl.Substring(2); 
      Route route = new Route(virtualPath, null); 
      var vpd = route.GetVirtualPath(requestContext, 
       requestContext.RouteData.Values); 
      if (vpd != null) 
      { 
       _redirectUrl = "~/" + vpd.VirtualPath; 
      } 
     } 

     return new RedirectHandler(_redirectUrl, false); 
    } 
} 

पुनर्निर्देशन http हैंडलर

public class RedirectHandler : IHttpHandler 
{ 
    private readonly string _redirectUrl; 

    public RedirectHandler(string redirectUrl, bool isReusable) 
    { 
     _redirectUrl = redirectUrl; 
     IsReusable = isReusable; 
    } 

    public bool IsReusable { get; private set; } 

    public void ProcessRequest(HttpContext context) 
    { 
     context.Response.Status = "301 Moved Permanently"; 
     context.Response.StatusCode = 301; 
     context.Response.AddHeader("Location", _redirectUrl); 
    } 
} 

मार्ग एक्सटेंशन

public static class RouteExtensions 
{ 
    public static void Redirect(this RouteCollection routes, string url, string redirectUrl) 
    { 
     routes.Add(new Route(url, new RedirectRouteHandler(redirectUrl))); 
    } 
} 

इन सब होने के बाद, मैं Global.asax.cs में मार्गों का मानचित्रण करते समय ऐसा कुछ कर सकता हूं।

routes.Redirect("", "/uk/Home/Index"); 

routes.Redirect("uk", "/uk/Home/Index"); 

routes.Redirect("uk/Home", "/uk/Home/Index"); 

.. other routes 
+0

बहुत अच्छी तरह से, धन्यवाद :) – Spikeh

+1

मार्ग चाहिए। रीडायरेक्ट अन्य सभी मार्गों (पूर्व मैप रूट) से पहले जाना है? क्या यह पुराने .aspx पेज रूटिंग के लिए काम करेगा? foo.aspx ->/foo – Seth

6

मेरी परियोजनाओं में, मेरे पास आमतौर पर "इंडेक्स रेडियोधर्मी" मेरे मार्ग में डिफ़ॉल्ट क्रिया के रूप में होता है (जिसका यूआरएल कभी दिखाई नहीं देगा) जो "असली" इंडेक्स पेज पर रीडायरेक्ट करने के अलावा कुछ भी नहीं करता है (जिसका यूआरएल हमेशा दिखाई देगा)।

आप इस क्रिया को अपने सभी नियंत्रक कक्षाओं के आधार वर्ग में बना सकते हैं।

+0

यह सबसे अच्छा समाधान था! – MEMark

+0

एक उपन्यास विचार, इच्छा है कि मैंने खुद के बारे में सोचा था! – melodiouscode