ASP.NET MVC توجيه عناوين URL القديمة التي تمرر معرفات QueryString إلى أفعال التحكم

StackOverflow https://stackoverflow.com/questions/817325

سؤال

نحن نركض حاليًا على IIS6 ، ولكن على أمل الانتقال إلى IIS 7 قريبًا.

نحن ننقل موقع ويب موجود إلى موقع ASP.NET MVC. لدينا عدد قليل من الصفحات القديمة التي نحتاج إلى إعادة توجيهها إلى وحدات التحكم الجديدة. صادفت هذا المقال الذي بدا مثيرًا للاهتمام:http://blog.eworldui.net/post/2008/04/aspnet-mvc---legacy-url-routing.aspx

لذلك أعتقد أنه يمكنني إما كتابة معالج المسار الخاص بي ، أو إعادة توجيهاتي في وحدة التحكم. هذا الأخير تنبعث منه رائحة قليلا.

ومع ذلك ، لست متأكدًا تمامًا من كيفية التعامل مع قيم سلسلة الاستعلام من عناوين URL القديمة التي أحتاج إلى نقلها إلى طريقة عرض وحدة التحكم الخاصة بي. فمثلا:

عنوان URL القديم:

/artists/viewartist.aspx؟id=4589

أريد أن يرسم هذا إلى:

ArtistsController عرض العمل

في الواقع ، يأخذ إجراء العرض الخاص بي اسم الفنان ، لذلك أريد إعادة توجيه المستخدم من عنوان URL القديم إلى /الفنانين /مادونا

شكرًا!

هل كانت مفيدة؟

المحلول

اعتمادًا على المقالة التي ذكرتها ، هذه هي الخطوات لإنجاز هذا:

1-يجب على LegacyHandler استخراج قيم الطرق من سلسلة الاستعلام (في هذه الحالة هو معرف الفنان) هنا هو الكود للقيام بذلك:

 public class LegacyHandler:MvcHandler
    {
        private RequestContext requestContext;
        public LegacyHandler(RequestContext requestContext) : base(requestContext)
        {
            this.requestContext = requestContext;
        }

        protected override void ProcessRequest(HttpContextBase httpContext)
        {
            string redirectActionName = ((LegacyRoute) RequestContext.RouteData.Route).RedirectActionName;

            var queryString = requestContext.HttpContext.Request.QueryString;
            foreach (var key in queryString.AllKeys)
            {
                requestContext.RouteData.Values.Add(key, queryString[key]);
            }

            VirtualPathData path = RouteTable.Routes.GetVirtualPath(requestContext, redirectActionName,
                                                                    requestContext.RouteData.Values);
            httpContext.Response.Status = "301 Moved Permanently";
            httpContext.Response.AppendHeader("Location", path.VirtualPath);

        }
    }

2- يجب عليك إضافة هاتين المسارين إلى Routetable حيث يكون لديك ArtistController مع إجراء ViewArtist الذي يقبل معلمة معرف من نوع int

    routes.Add("Legacy", new LegacyRoute("Artists/ViewArtist.aspx", "Artist", new LegacyRouteHandler()));

    routes.MapRoute("Artist", "Artist/ViewArtist/{id}", new
        {
         controller = "Artist",
         action = "ViewArtist",
        });

يمكنك الآن الانتقال إلى عنوان URL مثل: /artists/viewartist.aspx؟id=123

وسيتم إعادة توجيهك إلى:/الفنان/viewartist/123

نصائح أخرى

كنت أكافح قليلاً مع هذا حتى حصلت على رأسي حوله. كان من الأسهل بكثير القيام بذلك في وحدة تحكم مثلما فعلت Perhentian مباشرة في تكوين المسار ، على الأقل في وضعي لأن عناوين URL الجديدة لدينا لا تملك id فيهم. والسبب هو أنه في وحدة التحكم ، تمكنت من الوصول إلى جميع مستودعاتي وكائنات المجال. لمساعدة الآخرين هذا ما فعلته:

routes.MapRoute(null,
    "product_list.aspx", // Matches legacy product_list.aspx
     new { controller = "Products", action = "Legacy" }
);

public ActionResult Legacy(int catid)
{
    MenuItem menuItem = menu.GetMenuItem(catid);
    return RedirectPermanent(menuItem.Path);
}

menu هو كائن حيث قمت بتخزين المعلومات المتعلقة بإدخالات القائمة ، مثل المسار الذي هو عنوان URL لإدخال القائمة.

هذا يعيد التوجيه من على سبيل المثال

/product_list.aspx?catid=50

إلى

/pc-tillbehor/kylning-flaktar/flaktar/170-mm

لاحظ أن RedirectPermanent هو MVC3+. إذا كنت تستخدم إصدارًا قديمًا ، فأنت بحاجة إلى إنشاء 301 يدويًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top