Динамические URL-адреса в стиле «твиттер» с ASP.NET - PullRequest
0 голосов
/ 08 апреля 2010

Я хочу создать сайт MVC, который полностью контролирует структуру URL с помощью маршрутизации.

Особые требования:

www.mysite.com / = домашняя страница (домашний контроллер)

www.mysite.com / common / about = страница содержимого (общий контроллер)

www.mysite.com / common / contact = страница содержимого (общий контроллер)

www.mysite.com / john = страница пользователя в стиле твиттера (динамический контроллер)

www.mysite.com / sarah = страница пользователя в стиле Twitter (динамический контроллер)

www.mysite.com / me = страница пользователя премиум-класса (контроллер премиум-класса)

www.mysite.com / oldpage.html = 301 перенаправление на новую страницу

www.mysite.com / oldpage.asp? Id = 3333 = 301 перенаправление на новую страницу

Мои маршруты выглядят следующим образом:

        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Common",
            "common/{action}/{id}",
            new { controller = "common", action = "Index", id = "" }
        );

        routes.MapRoute(
            "Home",
            "",
            new { controller = "Home", action = "Index", id = "" }
            );



        routes.MapRoute(
            "Dynamic",
            "{id}",
            new { controller = "dynamic", action = "Index", id = "" }
            );

Для работы с 301 rredirct у меня есть база данных, определяющая старые страницы и их новые URL-адреса, и сохраненная процедура обработки поиска. Код (обработчик) выглядит так:

открытый класс AspxCatchHandler: IHttpHandler, IRequiresSessionState {

    #region IHttpHandler Members

    public bool IsReusable
    {
        get { return true; }
    }

    public void ProcessRequest(HttpContext context)
    {
        if (context.Request.Url.AbsolutePath.Contains("aspx") && !context.Request.Url.AbsolutePath.ToLower().Contains("default.aspx"))
        {
            string strurl = context.Request.Url.PathAndQuery.ToString();
            string chrAction = "";
            string chrDest = "";

            try
            {

                DataTable dtRedirect = SqlFactory.Execute(
                    ConfigurationManager.ConnectionStrings["emptum"].ConnectionString,
                    "spGetRedirectAction",
                    new SqlParameter[] { 
                        new SqlParameter("@chrURL", strurl)
                    },
                    true);

                chrAction = dtRedirect.Rows[0]["chrAction"].ToString();
                chrDest = dtRedirect.Rows[0]["chrDest"].ToString();

                chrDest = context.Request.Url.Host.ToString() + "/" + chrDest;
                chrDest = "http://" + chrDest;


                if (string.IsNullOrEmpty(strurl))
                    context.Response.Redirect("~/");
            }
            catch
            {
                chrDest = "/";// context.Request.Url.Host.ToString();
            }

            context.Response.Clear();
            context.Response.Status = "301 Moved Permanently";
            context.Response.AddHeader("Location", chrDest);
            context.Response.End();

        }
        else
        {
            string originalPath = context.Request.Path;
            HttpContext.Current.RewritePath("/", false);
            IHttpHandler httpHandler = new MvcHttpHandler();
            httpHandler.ProcessRequest(HttpContext.Current);
            HttpContext.Current.RewritePath(originalPath, false);
        }
    }

    #endregion
}

Очень просто найти пользователя, и фактически вышеприведенный код делает это. Моя проблема в динамической / премиальной части.

Я пытаюсь сделать следующее:

1) в динамическом контроллере ищите имя пользователя.

2) если имя пользователя находится в списке пользователей (базе данных), отобразить Index ActionResult динамического контроллера.

3) если имя пользователя не найдено, найдите имя пользователя в премиум-списке

4) если имя пользователя является фондом в премиум-листе (базе данных), тогда отобразите Index ActionResult контроллера Preium.

5) Если ничего не помогает, перейдите на страницу 404 (которая попросит пользователя зарегистрироваться)

Возможно ли это?

Двойной поиск пользователя - плохая идея для производительности?

Как мне это сделать без перенаправления?

1 Ответ

1 голос
/ 08 апреля 2010

Как организована ваша база данных? Надеюсь, одна таблица пользователей с индикатором статуса премиум, если это так, то вам действительно нужно всего лишь один раз попасть в базу данных. В противном случае вы могли бы получить пользу от представления, объединяющего пользовательские данные.

...