Я хочу создать сайт 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 (которая попросит пользователя зарегистрироваться)
Возможно ли это?
Двойной поиск пользователя - плохая идея для производительности?
Как мне это сделать без перенаправления?