编辑 Razor 页面中的 class 个元素列表

Edit class list of element in Razor Page

我有一个 Razor 页面,在 HTML 中有一个按钮列表,我希望能够更改这些按钮上的 class 列表以突出显示当前选定的按钮。每个按钮如下所示:

<form asp-page-handler="Posts" method="post">
    <button href="posts" class="nav-link text-white active" aria-current="page">
        Posts
    </button>
</form>

单击它时,它将调用一个处理程序方法,我想向其中添加活动 class 并从前一个中删除活动 class。这在 javascript 中是微不足道的,也许在 c# 中是这样,但经过一个小时的搜索,我找不到方法来做到这一点。

下面的解决方案使用 jquery/js.

  1. 将 data-attribute 添加到所有 .nav-link 按钮。我用了 data-page.
<button data-page="posts href="posts" class="nav-link text-white" aria-current="page">
   Posts
</button>
  1. 在您的帖子页面获取处理程序中,将“帖子”分配给某个视图数据索引。
ViewData["ActivePage"] = "posts";
  1. 然后在layout.cshtml中添加这个脚本。
@section scripts {
   <script> 
      $(document).ready(function(){
         @if(ViewData["ActivePage"] != null)
         {
            <text>var activePage = "@ViewData["ActivePage"]";</text>
         }
         else
         {
            <text>var activePage = "";</text>
         }

         // loop through navlinks and assign/remove active class
         $(".nav-link").each(function(){
            var dataPage = $(this).data("page");

            if(dataPage == activePage){
               $(this).addClass("active");
            }
            else{
               $(this).removeClass("active");
            }
         });
      });
   </script>
}

对于其他按钮,您只需要分配唯一性即可data-page; data-page= "other name";

然后在各自的handler方法中,添加ViewData["ActivePage"] = "other name";

由于脚本将包含在布局中,因此它会为所有页面激活。

这是一个工作演示,无需 js 即可将活动 class 添加到所选按钮: cshtml.cs:

[BindProperty]
        public List<Button> buttons { get; set; }
 public void OnGet()
        {
            buttons = new List<Button> { new Button { Id = 1, Content = "button1" }, new Button { Id = 2, Content = "button2"}, new Button { Id = 3, Content = "button3" } };
public IActionResult OnPostPosts(int id)
        {
            buttons.ForEach(b => b.IsActive = false);
            buttons.Where(b => b.Id == id).ToList().ForEach(b => b.IsActive = true);
            //save data to database,add data to gridBind

            return Page();
        }
            
           
        }

Button.cs:

 public class Button {
        public int Id { get; set; }
        public string Content { get; set; }
        public bool IsActive { get; set; }


    }

查看:

<form method="post">
    @for (var i = 0; i < Model.buttons.Count; i++)
    {
        <input hidden name="buttons[@i].Id" value=@Model.buttons[i].Id />
        <input hidden name="buttons[@i].Content" value=@Model.buttons[i].Content />
        <input hidden name="buttons[@i].IsActive" value=@Model.buttons[i].IsActive />


    }
    @foreach (var item in Model.buttons)
    {
        <input  type="submit" asp-page-handler="Posts" asp-route-id="@item.Id" class="nav-link text-white @(item.IsActive ? "active" : "")" aria-current="page" value="@item.Content" />

    }

</form>

结果:

我用jquery/js在这里写了一个简单的demo来展示当点击按钮时,按钮会添加active class和Bold borders以显示差异并删除上一个

的活动 class
<form asp-page-handler="Index" method="post">
    <button href="posts" class="nav-link text-black " aria-current="page" id="btn_submit1">
        Posts
    </button>
</form>
<br />
<form asp-page-handler="Index" method="post">
    <button href="posts" class="nav-link text-black " aria-current="page" id="btn_submit2">
        Posts1
    </button>
</form>
<br />
<form asp-page-handler="Index" method="post">
    <button href="posts" class="nav-link text-black " aria-current="page" id="btn_submit3">
        Posts2
    </button>
</form>

//...............

@section Scripts{
    <head>      
    <style>           
          .active{
                border: solid;
            }
    </style>
</head>
    <script>
        $(function(){
            var data = localStorage.getItem("index");
            if(data!=null){
                $("#"+data).addClass('active');
            }
        })

        $("button").click(function () {     
        localStorage.setItem("index",  this.id );
    });
    </script>
}