Как да прихванем външните хипервръзки в MVC3

Имам ситуация, при която два уеб сайта използват едни и същи данни (основна версия и мобилна). Така че в някои страници на основната версия имам вътрешни връзки като www.domain.com/link1... Но когато мобилната версия използва същата хипервръзка, тя насочва потребителския контекст към основния сайт, но трябва да прихвана тази заявка и да я обработя и за да пренасоча потребителя там, където трябва в случай на мобилна версия.

Да кажем, че в основната версия на сайта в страницата www.domain.com/about/strategy.aspx (webforms) имам абсолютен URL адрес към www.domain.com/services/item.aspx?Id=1256 и е добре. Но когато получих същата страница на mobile.domain.com/about/strategy (mvc), искам да променя връзката www.domain.com/services/item.aspx?Id=1256 на mobile.domain.com/services/1256 . Проблемът е, че имам > 10 000 страници с абсолютни URL адреси и мениджърите на съдържанието ще полудеят, управлявайки този проблем.

Някаква идея?


person Roman    schedule 21.03.2013    source източник


Отговори (4)


Вероятно ако търсите удобни за потребителя URL адреси в уеб формуляри, тогава отговорът е Пренаписване на URL адреси.

Можете да намерите някои dll файлове на трети страни/с отворен код за тази функционалност.

Уведомете ме, ако съм сбъркал с това, което изисквате. :)

person Hiren Desai    schedule 21.03.2013

Можете да разгледате тази статия:

http://www.iis.net/learn/extensions/url-rewrite-module/developing-a-custom-rewrite-provider-for-url-rewrite-module

person Stefano Altieri    schedule 21.03.2013

Мога да мисля за 2 възможни решения, всички те изискват javasctipt:

  1. Имате js функция, която ще замени URL адресите на вашите страници
  2. Имате js манипулатор, който ще улавя кликвания и ще препраща потребителя към вашето сървърно действие, където ще го пренасочвате, където искате.
person Dima    schedule 21.03.2013

Замених ръчно абсолютните URL адреси в DB като www.domain.com/services/service.aspx?Id=1000 става /services/service.aspx?Id=1000 с помощта на метода за замяна на SQL. И след това внедри RewritingModule с помощта на речник.

public class RewritingModule : IHttpModule
    {
        /// <summary>
        /// Инициализация
        /// </summary>
        /// <param name="application"></param>
        public void Init(HttpApplication application)
        {
            application.BeginRequest += ApplicationBeginRequest;
        }

        private static void ApplicationBeginRequest(object sender, EventArgs e)
        {
            var _httpContext = HttpContext.Current;

            foreach (KeyValuePair<string, string> item in DictionaryRewrites)
            {
                var currentUrl = _httpContext.Request.RawUrl;
                string itemKey = item.Key;

                if (currentUrl.Equals(itemKey, StringComparison.OrdinalIgnoreCase))
                {
                    Process301Redirect(_httpContext, item.Value);
                    break;
                }
            }

        }

        private static Dictionary<string, string> DictionaryRewrites = new Dictionary<string, string>() 
        { 
            { "/Services/Pavilions/Item.aspx?ItemID=5", "/exhibitions/pavillions/3/hall4" },
            { "/Services/ConferenceHalls/Item.aspx?ItemID=10127", "/conferences/conferencehalls/1/conferencehall1" }

        };

        /// <summary>
        /// 301 Redirect
        /// </summary>
        /// <param name="context"></param>
        /// <param name="toRedirect"></param>
        private static void Process301Redirect(HttpContext context, string toRedirect)
        {
            var _localizationSettings = EngineContext.Current.Resolve<LocalizationSettings>();
            var _workContext = EngineContext.Current.Resolve<IWorkContext>();
            var _httpContext = HttpContext.Current;
            var _webHelper = EngineContext.Current.Resolve<IWebHelper>();
            string applicationPath = _httpContext.Request.ApplicationPath;

            if (_localizationSettings.SeoFriendlyUrlsForLanguagesEnabled)
            {
                toRedirect = toRedirect.AddLanguageSeoCodeToRawUrl(applicationPath, _workContext.WorkingLanguage);
            }

            string str = _webHelper.GetApplicationLocation() + toRedirect;
            context.Response.AddHeader("Location", str);
            context.Response.Status = "301 Moved Permanently";
        }

        public void Dispose()
        {
            //clean-up code here.
        }
    }
person Roman    schedule 22.03.2013