使用ASP.NET的动态“推特风格”网址

时间:2010-04-07 23:48:51

标签: asp.net-mvc seo asp.net-mvc-routing

我希望制作一个MVC网站,它可以使用路由完全控制网址结构。

具体要求是:

www.mysite.com/ =主页(家庭控制器)

www.mysite.com/common/about =内容页面(通用控制器)

www.mysite.com/common/contact =内容页面(通用控制器)

www.mysite.com/john =推特式用户页面(动态控制器)

www.mysite.com/sarah =推特式用户页面(动态控制器)

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和存储的procdure来处理查找。代码(处理程序)如下所示:

公共类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)如果用户名是高级列表(数据库)中的基金,则显示Preium控制器的Index ActionResult。

5)如果所有其他方法都失败,请跳转到404页面(这将要求用户注册)

这可能吗?

两次查看用户对性能不是一个好主意?

如何在不重定向的情况下执行此操作?

1 个答案:

答案 0 :(得分:1)

您的数据库是如何组织的?希望一个用户表具有高级状态指示器,如果是这样,那么你真的只需要打一次数据库。否则,您可能会从组合用户数据的视图中受益。