Как бы вы "заставили" пользователей заполнить профиль перед просмотром сайта ASP.NET MVC?

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

Каков наилучший способ требовать от пользователей доступа к странице профиля, когда они пытаются посетить любую страницу на моем сайте, пока они не заполнили профиль?

Лучше ли это сделать с помощью чего-то вроде: "если (пользователь проверен!) - перенаправить на страницу профиля", расположенного в верхней части каждого контроллера? Есть ли более элегантное решение?

2 ответа

Решение

Начнем с реализации пользовательского фильтра действий (IActionFilter):

public class ProfileRequiredActionFilter : IActionFilter
{
    #region Implementation of IActionFilter

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        //TODO: Check if the Authenticated User has a profile.

        //If Authenicated User doesn't have a profile...
        filterContext.Result = new RedirectResult("Path-To-Create-A-Profile");
    }

    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
    }

    #endregion
}

Затем зарегистрируйте фильтр действий глобально внутри метода RegisterGlobalFilters файла Global.asax...

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new ProfileRequiredActionFilter());
}

Примечание. Если вы не хотите, чтобы этот фильтр применялся глобально, вы можете вместо этого создать ActionFilterAttribute и применить его к контроллерам и / или методам действий...

public class ProfileRequiredAttribute : ActionFilterAttribute
{
    #region Implementation of IActionFilter

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);

        //TODO: Check if the Authenticated User has a profile.

        //If Authenicated User doesn't have a profile...
        filterContext.Result = new RedirectResult("Path-To-Create-A-Profile");
    }

    #endregion
}

Вы можете создать базовый контроллер и наследовать все остальные контроллеры. Тогда есть метод OnActionExecuting в нем что-то вроде...

protected override void OnActionExecuting(ActionExecutingContext context)
{
    base.OnActionExecuting(context);

    // If the user has not filled out their profile, redirect them
    if(CurrentUser != null && !CurrentUser.IsVerified)
    {
        context.Result = new RedirectResult("/User/Profile/" + CurrentUser.ID);
    }
}
Другие вопросы по тегам