如何将数据从引导菜单项发送到 ASP.NET MVC 控制器

Posted

技术标签:

【中文标题】如何将数据从引导菜单项发送到 ASP.NET MVC 控制器【英文标题】:How to send data from a bootstrap menu item to an ASP.NET MVC controller 【发布时间】:2022-01-11 17:53:23 【问题描述】:

我在 C# Web 应用程序中有一个引导菜单。菜单如下所示:

        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
        <div class="container">
            <a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">realestate</a>
            <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                    aria-expanded="false" aria-label="Toggle navigation">
                <span class="navbar-toggler-icon"></span>
            </button>
            <div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
                <ul class="navbar-nav flex-grow-1">
                    <li class="nav-item">
                        <a class="nav-link text-dark" asp-area="" asp-controller="Newquestion" asp-action="Index">Add New Questions</a>
                    </li>
                    <li class="nav-item dropdown">
                        <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                            Chapter
                        </a>
                        <div class="dropdown-menu" aria-labelledby="navbarDropdown">
                            <a class="dropdown-item" asp-controller="Question" asp-action="Index">Salesperson questions - Chapter 1</a>
                        </div>
                    </li>
                </ul>
            </div>
        </div>
    </nav>

我有一个名为 QuestionController.cs 的控制器,当用户单击下拉菜单并选择“销售人员问题 - 第 1 章”的菜单选项时,它会获得控制权。这一切都很好。

如果我想添加另一个菜单选项,比如“销售人员问题 - 第 2 章”,我可以使用同一个控制器吗?我想将一段数据传递给控制器​​,以便控制器知道选择了哪个菜单选项。我想做这样的事情:

<div class="dropdown-menu" aria-labelledby="navbarDropdown">
    <a class="dropdown-item" asp-controller="Question" asp-action="Index(0)">Salesperson questions - Chapter 1</a>
    <a class="dropdown-item" asp-controller="Question" asp-action="Index(1)">Salesperson questions - Chapter 2</a>
</div>

因此,在上面的代码中,如果用户选择了第 1 章选项,则会将值 0 传递给控制器​​。如果用户选择第 2 章选项,则将值 1 传递给控制器​​。

这可能吗?

【问题讨论】:

【参考方案1】:

试试这样:

<div class="dropdown-menu" aria-labelledby="navbarDropdown">
    <a class="dropdown-item" asp-controller="Question" asp-action="Index" asp-route-id="0">Salesperson questions - Chapter 1</a>
    <a class="dropdown-item" asp-controller="Question" asp-action="Index" asp-route-id="1">Salesperson questions - Chapter 2</a>
</div>

像这样在您的操作中捕获 id:

public IActionResult MyAction(int? id)

    //do something with that id

你可以放任何东西而不是 id。但是您必须在该操作中使用该变量名。假设您可以使用 asp-route-name="john"。比你必须在那个动作中抓住名字。 如果您有匹配的名称路由,则 url 将是这样的

controller/action/john

但如果它与启动中定义的路由不匹配,那么它将像这样包装到查询参数中

controller/action?name=john

如果是查询参数,您必须像这样捕获变量

public IActionResult YourAction([FromQuery(Name = "name")] string name)

    // do whatever with that name

更多详情https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/built-in/anchor-tag-helper?view=aspnetcore-6.0#asp-route-value

【讨论】:

正是我想要的!我设置了一个断点,发现传入的值是((object[])this.ControllerContext.RouteData.Values.Values)[2]。这是我应该从中获取 id 值的地方,还是有首选的方法/变量? 如果解决了你的问题,那么你可以接受答案。这对你来说似乎很合适。你也可以投票。 答案更新了你如何在动作中捕获变量的部分【参考方案2】:

试试这个

<a class="dropdown-item" asp-controller="Question" asp-action="Index"  asp-route-id="1"> Salesperson questions - Chapter 1 </a>
<a class="dropdown-item" asp-controller="Question" asp-action="Index"  asp-route-id="2"> Salesperson questions - Chapter 2 </a>

【讨论】:

【参考方案3】:

我相信这就是你要找的,传递路线价值

<a asp-controller="Employee"
   asp-action="Index" 
   asp-route-id="@Model.Id">EmployeeId: @Model.Id</a>

或将静态值传递给操作

<a asp-controller="Question"
   asp-action="Index" 
   asp-route-id="1">Menu Item 1</a>

【讨论】:

以上是关于如何将数据从引导菜单项发送到 ASP.NET MVC 控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何在 asp.net 代码中获取引导文本框值并在存储过程中作为参数发送?

如何从 C# ASP.NET 参数将希伯来语文本发送到 SQL Server?

引导程序和 ASP.NET 菜单

如何使用 fetch 将 FormData 从 javascript 发送到 ASP.NET Core 2.1 Web API

Asp.net 如何将列表从代码隐藏发送到 javascript 以在 googlemap 中显示坐标

Asp.Net 将大量数据从视图发送到控制器