2015-05-20 2 views
0

У меня есть новое приложение MVC 4, с которым я играю. В принципе, несколько пунктов меню в верхнем, с текущим активной страницей, которая выделен с последующей JavaScript в моем _Layout.cshtml:Перенаправленный вид не отображает «активный» атрибут в приложении MVC

<script type="text/javascript"> 
    $(document).ready(function() { 
     $('#top-navbar .nav a[href="' + this.location.pathname + '"]').parent().addClass('active'); 
    }); 
</script> 

Это прекрасно работает при навигации по меню в верхнем. Однако я добавляю возможность «входа», и если пользователь попытается вернуться на страницу входа после того, как они уже вошли в систему, он просто отправит их в виде Index вместо Login. Проблема в том, что CSS по-прежнему выделяет кнопку Login в меню, а не кнопку Home.

Я сохраняю данные для входа пользователя через состояние Session. Вот Login()ActionResult:

[HttpGet] 
public ActionResult Login() 
{ 
    if (Session["ContactName"] != null) 
    { 
     return View("Index"); 
    } 
    else 
    { 
     return View(); 
    } 
} 

Как вы можете видеть, если ContactName не null, то они уже вошли в систему, поэтому он посылает им Home вид. Должен ли я вместо этого Redirect() на главную страницу?

Кроме того, здесь есть меню navbar при необходимости:

<ul class="nav navbar-nav"> 
    <li>@Html.ActionLink("Home", "Index", "Home")</li> 
    <li>@Html.ActionLink("About Us", "About", "Home")</li> 
    <li>@Html.ActionLink("Customer Login", "Login", "Home")</li> 
</ul> 
+0

Вы должны вернуть 'RedirectToAction («Index»,«Home»)'. То, что у вас есть, просто использует представление «Индекс», но URL-адрес все равно будет отражать состояние «Вход». – Jasen

ответ

2

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

[HttpGet] 
public ActionResult Login() 
{ 
    if (Session["ContactName"] != null) 
    { 
     return RedirectToAction("Index", "Home"); 
    } 
    else 
    { 
     return View(); 
    } 
} 
+0

А, 'RedirectToAction()' был именно тем, что я искал! –

2

Вы можете удалить JQuery для установки активного меню и использовать это в вашем NavBar тег:

<ul class="nav navbar-nav"> 
    <li class="@(ViewContext.RouteData.Values["Action"].ToString() == "Index" ? "active" : "")">@Html.ActionLink("Home", "Index", "Home")</li> 
    <li class="@(ViewContext.RouteData.Values["Action"].ToString() == "About" ? "active" : "")">@Html.ActionLink("About", "About", "Home")</li> 
    <li class="@(ViewContext.RouteData.Values["Action"].ToString() == "Contact" ? "active" : "")">@Html.ActionLink("Contact", "Contact", "Home")</li> 
</ul> 

Или вы могли бы реализовать некоторые HtmlHelper делают то же самое, что и в том, что показано в этом сообщении: http://chrisondotnet.com/2012/08/setting-active-link-twitter-bootstrap-navbar-aspnet-mvc/

+0

Это отлично работает. Я пытался найти приятное решение, а JQuery раньше был самым простым, с чем я смог придумать. Это хорошо и не требует каких-либо скриптов! –

Смежные вопросы