如何拦截MVC3中的外部超链接

时间:2013-03-21 11:20:18

标签: c# asp.net-mvc-3 hyperlink external

我有这种情况,其中两个网站使用相同的数据(主版和移动版)。因此,在主版本的某些页面中,我有内部链接,如www.domain.com/link1 ... 但是当移动版本使用相同的超链接时,它会将用户上下文定向到主站点,但我需要拦截该请求并处理它,并在移动版本的情况下将用户重定向到我需要的地方。

让我们在www.domain.com/about/strategy.aspx(netforms)页面的网站主版本中说我有一个绝对的网址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 。问题是我有>拥有绝对网址和内容管理员的10000个网页会疯狂地管理这个问题。

有什么想法吗?

4 个答案:

答案 0 :(得分:0)

如果您希望在Web表单中寻找用户友好的URL,那么答案就是URL重写。

您可以找到一些第三方/开源dll来实现此功能。

如果我对你的要求有误,请告诉我。:)

答案 1 :(得分:0)

答案 2 :(得分:0)

我可以考虑两种可能的解决方案,所有这些解决方案都需要javasctipt:

  1. 您的js功能会覆盖您网页上的网址
  2. 你有js处理程序,它将捕获点击并转发用户 您的服务器操作,您可以将其重定向到您想要的位置。

答案 3 :(得分:0)

我已经手动更换了DB中的绝对URL,例如www.domain.com/services/service.aspx?Id=1000使用SQL替换方法成为/services/service.aspx?Id=1000。然后使用Dictionary实现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.
        }
    }