Как я могу перенаправить сайт на основе даты в ASP.NET MVC? - PullRequest
0 голосов
/ 17 июня 2011

Я пытаюсь найти лучший способ перенаправить пользователя на страницу на основе текущей даты.Именно то, что я пытаюсь сделать, находится в коде ниже.

DateTime Today = DateTime.Now;
DateTime LaunchDate = DateTime.Parse("17/06/11");
DateTime CloseDate = DateTime.Parse("19/06/11");

int isClosed = DateTime.Compare(CloseDate, Today);
int isOpen = DateTime.Compare(LaunchDate, Today); 

if (isClosed < 0){
    return RedirectToAction("Closed", "Home");
}
else if (isOpen > 0){
    return RedirectToAction("Index", "Home");
}
else{
    return RedirectToAction("ComingSoon", "Home");
}

Куда в global.asax (или это вообще возможно) могло бы пойти это условие?

Ответы [ 4 ]

2 голосов
/ 17 июня 2011

Я бы поместил этот код в пользовательский MvcHandler .

Вы можете поместить его в ActionFilter , но тогда вам придется применить его ко всем действиям.

0 голосов
/ 18 июня 2011

Вот код, который я использую для аналогичного требования, с парой дополнительных функций, облегчающих тестирование. Его можно настроить как глобальный фильтр, хотя я предпочитаю применять его к контроллерам / действиям индивидуально, чтобы перед запуском были доступны определенные страницы.

Обратите внимание, что это возвращает ViewResult, а не RedirectResult - таким образом сохраняется оригинальный URL, что означает, что если кто-то с нужной ролью входит в систему со страницы заполнителя, он может быть перенаправлен на URL, который он первоначально запрашивал.

public sealed class PreviewAuthAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);

        // todo: if site is live, show page 
        if (DataStore.Instance.Settings.Get("islive") == "True") return;

        // if request is from localhost or build server, show page
        if (filterContext.HttpContext.Request.IsLocal) return;
        if (filterContext.HttpContext.Request.UserHostAddress.StartsWith("192.168.0")) return;

        // if user has has beta role, show page
        if (filterContext.HttpContext.Request.IsAuthenticated && (filterContext.HttpContext.User.IsInRole("Beta"))) return;


        // site is not live and user does not have access - show placeholder

        filterContext.Result = new ViewResult()
        {                
            ViewName="Placeholder",
            ViewData = filterContext.Controller.ViewData,
            TempData = filterContext.Controller.TempData
        };
    }

}
0 голосов
/ 17 июня 2011

Вы можете создать пользовательские RouteConstraints, внедрив IRouteConstraint. В методе match вы можете добавить логику для дат, которые вы хотите проверить. Это потребует от вас иметь несколько маршрутов в вашем маршруте. которые все относятся к разным контроллерам / действиям, где вы можете показывать пользователю другое представление.

Ниже url показывает множество примеров того, как реализовать пользовательскую RouteConstraint. http://stephenwalther.com/blog/archive/2008/08/07/asp-net-mvc-tip-30-create-custom-route-constraints.aspx

0 голосов
/ 17 июня 2011

Я бы не стал делать это в global.asax, хотя вы можете настроить это, чтобы выяснить маршруты, которые вы зарегистрировали.Предполагается, что весь «сайт» скоро будет открыт, открыт и закрыт.Проблема с этим методом, если он работает в вашем случае, заключается в том, что кто-то может обойти, играя вокруг.Ой!

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

...