【发布时间】:2021-09-19 21:36:55
【问题描述】:
我是 ASP.NET Core MVC 的新手。我会先说我已经阅读了其他类似的问题,但它们与我遇到的问题并不完全相同。
我正在尝试实现动态左侧导航,其中每个按钮都从我的数据库中加载。
当我在“_Layout.cshtml”中调用 @Html.Action("NavMenu", "Nav") 时出现错误
错误 CS1929
“IHtmlHelper”不包含“Action”的定义,最佳扩展方法重载“UrlHelperExtensions.Action(IUrlHelper, string, object)”需要“IUrlHelper”类型的接收器
其他类似的问题之一导致我将@using System.Web.Mvc.Html 添加到“_ViewImports”的顶部,这导致了错误:
CS7069:对“RouteValueDictionary”类型的引用声称它在“System.Web”中定义,但找不到
还说@html.Action()应该内置到Core 2.0中
使用@await Html.PartialAsync("_SideNav") 仅适用于我的索引视图,因为该视图具有@model IEnumerable<HSCWebApp.Models.HSCTable>,但我的其他视图需要@model HSCWebApp.Models.HSCTable,这会导致“_SideNav”崩溃
我 100% 愿意接受其他方式来实现这一点。
在 NuGet 中我已经安装了:
- 实体框架
- Microsoft.AspNet.Mvc
- Microsoft.AspNetCore.App
- Microsoft.NETCore.App
编辑:
在构建过程中我也收到了这些警告:
警告 NU1701 包“Microsoft.AspNet.Mvc 5.2.2”已使用“.NETFramework,Version=v4.6.1”而不是项目目标框架“.NETCoreApp,Version=v2.1”恢复。此软件包可能与您的项目不完全兼容。
以及用于实体框架的 AspNet.Razor AspNet.Webpages
这些警告会以某种方式影响我的引用吗?
这里是文件:
控制器:(“NavController.cs”)
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using HSCWebApp.Models;
using Microsoft.EntityFrameworkCore;
namespace HSCWebApp.Controllers
{
public class NavController : Controller
{
private readonly HSCWebAppContext _context;
public NavController(HSCWebAppContext context)
{
_context = context;
}
public ActionResult NavMenu()
{
NavViewModel nav = new NavViewModel();
List<NavViewModel> navList = new List<NavViewModel>();
var items = from n in _context.HSCTable select n;
List<HSCTable> tableList = items.ToList<HSCTable>();
for (int i = 0; i < tableList.Count(); i++)
{
nav.Id = tableList[i].ID;
nav.DepartmentName = tableList[i].DepartmentName;
nav.sel = tableList[i].sel;
navList.Add(nav);
}
//var movies = from m in _context.Movie select m;
//IEnumerable<NavViewModel> en = navList;
//IEnumerable<HSCTable> en = tableList;
return PartialView("_SideNav", tableList);
}
}
}
模型:(“NavViewModel.cs”)
using System.ComponentModel.DataAnnotations.Schema;
namespace HSCWebApp.Models
{
[Table("HSCTable")]
public class NavViewModel
{
public NavViewModel(){
int Id = this.Id;
string DepartmentName = this.DepartmentName;
string sel = this.sel;
}
public int Id { get; set; }
public string DepartmentName { get; set; }
public string sel { get; set; }
}
}
查看:("_SideNav.cshtml")
@model IEnumerable<HSCWebApp.Models.HSCTable>
@using System;
@using System.Collections;
@using System.Linq;
@{
List<List<string>> navButtons = new List<List<string>>();
int listIndex = 0;
int INITIAL = 0;
navButtons.Add(new List<string>());
navButtons[listIndex].Add("");
}
<body>
<div class="sidenav">
@{
foreach (var item in Model)
{
if (navButtons[listIndex][INITIAL].Equals(null)
|| navButtons[listIndex][INITIAL].Equals(""))
{
// if the list of lists is empty, add the department name
//initialize the list with with the department name
navButtons[listIndex][INITIAL] = item.DepartmentName;
//add the current select
navButtons[listIndex].Add(item.sel);
}
else if (navButtons[listIndex][INITIAL].Equals(item.DepartmentName))
{
// if the current item's department name is the same
// is the current list's department name,
// add it's selectn
navButtons[listIndex].Add(item.sel);
}
else if (!item.DepartmentName.Equals(navButtons[listIndex][INITIAL]))
{
// if the current item's department name
// is not the same as the initial of this list,
// create new list
navButtons.Add(new List<string>());
listIndex++;
navButtons[listIndex].Add(item.DepartmentName);
navButtons[listIndex].Add(item.sel);
}
}
for (int i = 0; i < navButtons.Count; i++)
{
<button class="accordion"
onclick="openAccordion(this)">
@navButtons[i][INITIAL]
</button>
<div class="tab">
@for (int j = 1; j < navButtons[i].Count; j++)
{
<a class="tabLinks NoPrint"
onclick="openTab(this)"
asp-action="Details"
asp-route-id="@navButtons[i][j]">
@navButtons[i][j].ToString()
</a>
}
</div>
}
// @Url.Action("Details", "HSCTables", new { id = 1 })
//onclick = "location.href='@Url.Action("Details","HSCTables", new { id = 1 })
}
</div>
</body>
非常感谢您的宝贵时间。
【问题讨论】:
-
你有意见
NavMenu.cshtml吗? -
@Llazar 我没有,_SideNav 是我想要渲染的视图,用“_SideNav”替换“NavMenu”仍然会出现同样的错误。除非我完全没有抓住重点?
-
Partials 视图不能在那个范围内工作。从您的代码中,我认为您可以在其中创建一个 viewComponent 。但是,如果您决定创建视图
NavMenu并从中调用局部视图_SideNav。 -
@Llazar 我也一直在查看组件,但我按照教程制作了这个部分视图,所以我猜我的
"_SideNav"是我的控制器返回中的一个参数导致问题/不能以这种方式使用?根据我的阅读,视图组件是我的最佳选择,但我肯定想知道为什么这不起作用。 -
您的实体框架问题与此问题无关。您应该删除任何提及和标签。如果您无法解决该警告,请提出一个新问题。
标签: c# asp.net asp.net-mvc asp.net-core-mvc