【问题标题】:Html Helper 'Action' is Undefined, Asp.NET Core 2.2Html Helper 'Action' 未定义,Asp.NET Core 2.2
【发布时间】: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


【解决方案1】:

正如@Tiago Ávila 所说,Html.Action 已从 Asp.NET Core 中删除,因此我不再尝试使用 @html.action 执行此操作,而是使用 View Components,正如 @Llazar 建议的那样,它奏效了!

我的视图组件:

public class NavViewComponent : ViewComponent
    {

        private readonly HSCWebAppContext _context;

        public NavViewComponent(HSCWebAppContext context)
        {
            _context = context;
        }

        public IViewComponentResult Invoke()
        {

            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);
            }

            return View("_SideNav",tableList);
        }

    }

我在 _Layout 中的调用:

@await Component.InvokeAsync("Nav")

没有其他需要更改的。感谢您的帮助!

【讨论】:

    【解决方案2】:

    “作为答案发布”。

    正如我所说,Html.Action 已从 ASP.NET Core 中删除,并被替换为 ViewComponents。

    Microsoft Docs 里面有很好的教程,可以看here。说明优点,什么时候可以为你的ViewComponent放置View,如何使用参数等等。

    【讨论】:

    • 是的,我阅读了该文档,但我已经完成了部分视图的所有“工作”。作为一个业余爱好者,我只是想“为什么要为视图组件重做所有这些工作,当我可以只使用部分视图时”我希望他们提到部分视图已被删除。
    • @ZaeemQ 实际上,局部视图仍在 ASP.NET Core 中,您可以使用'@await Html.PartialAsync("_PartialName")' 调用局部视图。只是 Html.Action 被替换了。
    • 哦,这就是我的意思。我使用了partialAsync,但它只适用于我的索引页面,而不适用于我的其他页面。由于_SideNav 的编写方式,部分异步继承了父视图包,它适用于我的索引视图,但不适用于其他视图。
    猜你喜欢
    • 2017-06-21
    • 1970-01-01
    • 2011-07-24
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 2016-07-18
    • 2019-06-17
    相关资源
    最近更新 更多