Вопрос по razor, c#, asp.net-mvc – В .NET MVC есть простой способ проверить, нахожусь ли я на домашней странице?

8

Мне нужно предпринять определенные действия, если пользователь входит в систему с домашней страницы. В моей LogOnModel у меня есть скрытое поле:

@Html.Hidden("returnUrl", Request.Url.AbsoluteUri)

В моем контроллере мне нужно проверить, является ли это значение домашней страницей или нет. В приведенном ниже примере я проверяю, находится ли пользователь на определенной странице («Account / ResetPassword»). Есть ли способ проверить, находятся ли они на главной странице, не прибегая к регулярным выражениям?

    [HttpPost]
    public ActionResult LogOnInt(LogOnModel model)
    {
       if (model.returnUrl.Contains("/Account/ResetPassword"))
       {
          return Json(new { redirectToUrl = @Url.Action("Index","Home")});
       }

Есть идеи? Миллион спасибо!

Ваш Ответ

4   ответа
0

Ты можешь использовать

  Request.Url.AbsoluteUri

Затем просто проверьте строку для имени страницы.

Возможно, это не лучший способ, но это быстрый и простой способ.

Я получил этот метод с этой страницы:

Как получить URL текущей страницы в MVC 3

Там также есть другой ответ, который может быть полезен для вас.

Спасибо Газ - очень ценят. Это текущий подход, который я использую. Hairgami_Master
7

вRouteData. Предполагая, что контроллер, который вы используете для домашней страницы, называется «HomeController», тогдаRouteData для запроса будет содержать значение «Home» для ключа «Controller».

Это будет выглядеть примерно так:

вместо (или в дополнение к тому, если у вас есть другие причины для этого):

 @Html.Hidden("returnUrl", Request.Url.AbsoluteUri)

вам придется

 @Html.Hidden("referrer", Request.RequestContext.RouteData.Values['Controller'])

и ваш контроллер будет выглядеть так:

[HttpPost]
public ActionResult LogOnInt(LogOnModel model)
{
   if (model.referrer = "Home")
   {
      return Json(new { redirectToUrl = @Url.Action("Index","Home")});
   }
 }

Это исключило бы необходимость использования.Contains()

Обновит:

Вы также можете устранить необходимость в скрытом поле (и, таким образом, уменьшить общий вес страницы для того, что может показаться на каждой странице в вашем приложении), сопоставив URL-адрес реферера Request.UrlReferrer.AbsoluteUri) к маршруту. Здесь есть пост об этом.

Как получить RouteData по URL?

Идея состоит в том, чтобы использовать механизм mvc для сопоставления URL-адреса реферера с маршрутом MVC вLogOnInt метод, позволяющий коду быть полностью автономным.

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

Благодарность! Я собираюсь дать этому шанс. Я предполагаю, что когда я нахожусь на главной странице (Главная / Индекс), это даст мне это значение, хотя фактический URL пользователя не отображает его? Hairgami_Master
Чтобы получить имя контроллера, вам необходимо получить доступ к свойству Values объекта RouteData, например: Request.RequestContext.RouteData.Values ["Controller"] Rafe
@ Rafe, спасибо, что указал на это, я даже не заметил этой ошибки. parKing
@ Hairgami_Master Предполагая, что у вас есть контроллер с именем "HomeController" и действие с именем "Index", RouteData.Values ["Controller"] будет возвращать только "Home", однако вы можете получить доступ к действию с помощью RouteData.Values ["Action «] parKing
5

.

@ViewContext.Controller.ValueProvider.GetValue("controller").RawValue.ToString()

Это достаточно просто? :)

@ Tohid - спасибо миллион, я думаю, это то, что я искал. Кроме того, я предполагаю, что я также могу указать «действие» в качестве значения. Hairgami_Master
3

Вы можете получить текущий URL через

string controller = (string)ViewContext.RouteData.Values["controller"];
string action = (string)ViewContext.RouteData.Values["action"];
string url = Url.Action(action, controller);

Вы можете сделать это в HtmlHelper или в контроллере, который отображает вид входа в систему.

Хранитьurl в скрытом поле, как вы сделали, затем в вашем посте действия:

[HttpPost]
public ActionResult LogOnInt(LogOnModel model)
{
   // Create your home URL
   string homeUrl = Url.Action("Index", "Home");
   if (model.referrer == homeUrl)
   {
      return Json(new { redirectToUrl = @Url.Action("Index","Home")});
   }
 }

Преимущество использованияUrl.Action означает, что он будет использовать вашу таблицу маршрутов для генерации URL, то есть, если ваши маршруты когда-либо изменятся, вам не придется изменять этот код.

Спасибо Омар. Вход в систему происходит через: Hairgami_Master

Похожие вопросы