我希望制作一个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页面(这将要求用户注册)
这可能吗?
两次查看用户对性能不是一个好主意?
如何在不重定向的情况下执行此操作?
答案 0 :(得分:1)
您的数据库是如何组织的?希望一个用户表具有高级状态指示器,如果是这样,那么你真的只需要打一次数据库。否则,您可能会从组合用户数据的视图中受益。