2015-07-01 103 views
8

我是一名学生,对于ASP.NET MVC来说相当新颖,我来自ASP.NET Web Form。 (习惯了)ASP.NET MVC 5 - 获取当前视图的名称(Razor .cshtml端)

我有一个列表:

<ul class="sidebar bg-grayDark"> 
    <li class="active"> 
     <a href="@Url.Action("Index", "Home")"> 
      <span class="mif-home icon"></span> 
      <span class="title">Home</span> 
     </a> 
    </li> 
    <li class="bg-hover-black"> 
     <a href="@Url.Action("Index", "Product")"> 
      <span class="mif-shop icon"></span> 
      <span class="title">Products</span> 
      <span class="counter">14</span> 
     </a> 
    </li> 
    <li class="bg-hover-black"> 
     <a href="@Url.Action("Index", "Category")"> 
      <span class="mif-flow-cascade icon"></span> 
      <span class="title">Categories</span> 
      <span class="counter">9</span> 
     </a> 
    </li> 
    <li class="bg-hover-black"> 
     <a href="@Url.Action("Index", "User")"> 
      <span class="mif-users icon"></span> 
      <span class="title">Users</span> 
      <span class="counter">1</span> 
     </a> 
    </li> 
</ul> 

我的目标: 通过其观点被渲染,我要添加“活动”的已被点击。 例如:我点击“类别”,然后Home丢失了他的活动课程,并且类别被添加到他的课程中。 (和“bg-hover-black”

我以为我可以通过检查实际呈现的视图来做到这一点,但我不知道该怎么做。 (我不知道如何检查呈现实际的观点,但使用剃刀来检查的条件是好的)

我用JavaScript第一次尝试:


    $(function() { 
     $('.sidebar').on('click', 'li', function() { 
      if (!$(this).hasClass('active')) { 
       $('.sidebar li').removeClass('active'); 
       $(this).addClass('active'); 
      } 
     }) 
    }) 

但它不起作用,因为在页面加载时,该html被重新渲染为主动部分的“活动”。 (如果我删除主页的“活动”,则除点击和页面加载之外,没有任何内容会被激活)。

你有什么解决方法吗?我在网上搜索了很多,但没有找到任何帮助。

对不起,有任何英文错误,我还在学习它:)。

谢谢,

Hellcat8。

+0

该帖子的开头并未显示..这里是: “大家好, 我是一名学生,对ASP.NET MVC [...]颇为新颖” – Hellcat8

回答

6

由于您使用在您的网页被命名约定控制器后,你可以在剃刀做到这一点,以获得控制器/网页名称:

@{ 
var pageName = ViewContext.RouteData.Values["controller"].ToString() 
} 

<ul class="sidebar bg-grayDark"> 
    <li class="@(pageName == "Home" ? "active" : "")"> 
     <a href="@Url.Action("Index", "Home")"> 
      <span class="mif-home icon"></span> 
      <span class="title">Home</span> 
     </a> 
    </li> 
    <li class="bg-hover-black @(pageName == "Product" ? "active" : "")"> 
     <a href="@Url.Action("Index", "Product")"> 
      <span class="mif-shop icon"></span> 
      <span class="title">Products</span> 
      <span class="counter">14</span> 
     </a> 
    </li> 
    <li class="bg-hover-black @(pageName == "Category" ? "active" : "")"> 
     <a href="@Url.Action("Index", "Category")"> 
      <span class="mif-flow-cascade icon"></span> 
      <span class="title">Categories</span> 
      <span class="counter">9</span> 
     </a> 
    </li> 
    <li class="bg-hover-black @(pageName == "User" ? "active" : "")"> 
     <a href="@Url.Action("Index", "User")"> 
      <span class="mif-users icon"></span> 
      <span class="title">Users</span> 
      <span class="counter">1</span> 
     </a> 
    </li> 
</ul> 

这将设置您的页面服务器端的活动类,消除需要使用JavaScript做这个客户端。

+0

非常感谢!这是工作 ! :)还有一件事:你有一些链接,我可以有一些有关剃刀可能性的信息? ! 在网络上,我只有再次找到基本的东西一样,如果和foreach等.. :( 感谢 – Hellcat8

+0

没问题哥们,很高兴我能帮助:) –

+0

http://stackoverflow.com/a/3389151/1062224 –

2

确认:当用户点击该项目时,您正在更改页面。因为这个原因,你的javascript将会运行,但是整个页面被重写并且你回到了第一个状态(也就是说,Home中的Home被激活,因为它在标记中)。

要检查当前页面,则可以使用location.href,并将它与href网址相比,这样的:

$(function() { 
    $("ul.sidebar>li").removeClass("active"); // or just not have active in the markup 
    $("li>a[href=" + location.href + "]").closest("li").addClass("active"); 
}); 

另外,并且这将是更强大的,你可以通过一个令牌(字符串,枚举或const)在与所述视图模型,并检查,例如:

<ul class='sidebar'> 
    <li data-page='home'... 
    ... 
    <li data-page='categories'... 

然后

$(function() { 
    $("li[[email protected]]").addClass("active") 

(或者只是在标记......)

<li data-page='categories' @(Model.PageName == 'Categories' ? "class=active" : "")> 
+1

非常感谢花时间帮助我! :) – Hellcat8

相关问题