14

We are in se same situation as question Make Twitter Bootstrap navbar link active, but in our case we are using ASP.net and MasterPages...

The thing is the navbar is defined at the masterpage and when you click a menuitem you are redirected to the corresponding child page so how would you do to change the navbar active item consecuently without replicating the logic in each child page? (Preferably without session variables and javascript only at master page)

Community
  • 1
  • 1
VSP
  • 2,367
  • 8
  • 38
  • 59
  • There are already similar responses in: [here](http://stackoverflow.com/questions/17984553/how-to-set-navbar-item-as-active-when-user-selects-it/38597482) – Cesar Alvarado Diaz Jul 26 '16 at 19:25

5 Answers5

18

We solved it with the following function at Master Page:

 <script type="text/javascript">
        $(document).ready(function () {
            var url = window.location.pathname;
            var substr = url.split('/');
            var urlaspx = substr[substr.length-1];
            $('.nav').find('.active').removeClass('active');
            $('.nav li a').each(function () {
                if (this.href.indexOf(urlaspx) >= 0) {
                    $(this).parent().addClass('active');
                }
            });
        });
    </script>
VSP
  • 2,367
  • 8
  • 38
  • 59
  • If you want to use jQuery for this, I would recommend to just set the active class to the parent li tag of the active a tag. See my answer below. – Tillito Oct 14 '14 at 23:59
3

Here is what I have used in Razor:

<li class="@(Model.PageName == "DataEntryForms" ? "active" : "")">
  <a href="DataEntryForms">     
    Data Entry Forms
  </a>
</li>
<li class="@(Model.PageName == "UserAdmin" ? "active" : "")">
  <a href="UserAdmin">      
    User Administration
  </a>
</li>

Just define the name of the page as property in the model, then complete the test for each li that you have.

David Robbins
  • 9,996
  • 7
  • 51
  • 82
3
 <script type="text/javascript">
     $(document).ready(function () {
         var url = window.location;
         $('ul.nav li a').each(function () {
             if (this.href == url) {
                 $("ul.nav li").each(function () {
                     if ($(this).hasClass("active")) {
                         $(this).removeClass("active");
                     }
                 });
                 $(this).parent().parent().parent().addClass('active');
                 $(this).parent().addClass('active');                     
             }
         });
     });
</script>
1

Assuming that the active class is set correctly by ASP.net, I would recommend an easier solution:

// Add the class to the parent li element of the active a element:
$('#NavigationMenu ul li a.active').parent().addClass('active');

// Remove the active class from the a element:
$('#NavigationMenu ul li a.active').removeClass('active');

Using ASP.net routing, this solution works smoothly in my current project.

And if you want to manipulate the active item of the menu, I would recommend to use the MenuItemDataBound of the menu control in code behind instead. But in my case, this was not necessary.

Tillito
  • 7,718
  • 7
  • 34
  • 31
0

Solution by "sujit kinage" worked best for me, however I had to change one line:

var url = window.location.origin + window.location.pathname;
Nikolay Mihaylov
  • 3,868
  • 8
  • 27
  • 32
Megrez7
  • 1,423
  • 1
  • 15
  • 35