Как узнать имя текущего контроллера/действия/представления?

У меня есть код, который я помещаю в код основной страницы. Эта мастер-страница является моим основным макетом, и цель кода — проверить, вошел ли пользователь в систему, и предпринять соответствующие действия в зависимости от того, вошел он или нет. Мне было бы интересно услышать об альтернативных методах подхода к этому, но пока я делаю это так, поскольку это прямой перенос из другой среды MVC, и я хочу изменить как можно меньше кода или потока во время переноса.

Мой реальный вопрос заключается в том, как определить имя текущего контроллера, действия и представления, которые выполняются? Часть логики кода программной части зависит от знания имени текущей страницы. Чтобы быть конкретным, он говорит (псевдокод):

if (!isLoggedIn && !isLoginPage)
    Redirect(loginPage);

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


person D'Arcy Rittich    schedule 30.11.2008    source источник
comment
Если вы будете следовать тому, что предложил Роб Конери, вам не нужно будет управлять этим, это произойдет автоматически, по волшебству.   -  person Todd Smith    schedule 01.12.2008


Ответы (3)


Взгляните на атрибут Authorization для контроллеров и действий контроллеров. Это должно избавить вас от каких-либо действий в коде главной страницы.

person MrJavaGuy    schedule 30.11.2008
comment
Спасибо, я посмотрю на это, но мой главный вопрос: как узнать, какой контроллер/действие/представление выполняется в данный момент? - person D'Arcy Rittich; 01.12.2008
comment
Если вы находитесь в пути кода контроллера, this.RouteData.Values ​​предоставит вам имя контроллера, имя действия и другие параметры. Однако, когда вы находитесь в представлении, контроллер был удален, поэтому нет никакого способа узнать. - person MrJavaGuy; 01.12.2008
comment
Вы также можете переопределить метод OnResultExecuted на контроллере, чтобы получить все три. - person MrJavaGuy; 01.12.2008

Лучшей проверкой того, вошел ли пользователь в систему (при условии, что вы используете FormsAuth), является User.Identity.IsAuthenticated, который доступен из представлений или контроллера.

Мне кажется, вам нужно подключить здесь аутентификацию с помощью форм — она обрабатывает все за вас, включая перенаправления. В вашем web.config убедитесь, что это добавлено:

<authentication mode="Forms">
    <forms loginUrl="~/Account/Login"/>
</authentication>

Это говорит вашему приложению, что вы используете аутентификацию с помощью форм. Затем используйте ActionFilter для методов, которые вы хотите заблокировать:

/// <summary>
/// Default view
/// </summary>
/// <returns></returns>
[Authorize(Roles="Administrator")]
public ActionResult Index()
{
    return View();
}

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

person Community    schedule 01.12.2008

Обратите внимание, что существует несколько описанных способов передачи данных на главные страницы здесь.

person D'Arcy Rittich    schedule 03.12.2008