如何将数据从引导菜单项发送到 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?
如何使用 fetch 将 FormData 从 javascript 发送到 ASP.NET Core 2.1 Web API