未找到 ViewComponent

ViewComponent was not found

所以我有一个视图组件,它使用以下代码从标记中调用。

@await Component.InvokeAsync("NotesDock", new { notes = new List<NoteModels>(), notesType = NotesFactoryCategoryEnums.Driver, targetId = @Model.DriverToView.DriverId })

上面的代码运行良好,视图组件已加载。

我想在用户创建或更新笔记时重新加载视图组件。为此,我对调用视图组件的控制器进行了 ajax 调用。这是行不通的。我在图 1(问题底部)中收到错误消息,指出即使标记中的 invoke 方法运行良好,也无法找到视图组件。

Ajax 通话:

function ReloadNotesDock(notesType, targetId) { 
  
    var token = $('input:hidden[name="__RequestVerificationToken"]').val();
    var turl = `/NotesDock/OnGetReloadNotesDock?handler=OnGetReloadNotesDock&objectType=${notesType}&targetId=${targetId}`;

    $.ajax({
        type: "GET",
        beforeSend: function (xhr) {
            xhr.setRequestHeader("XSRF-TOKEN", token);
        },
        dataType: "html",
        url: turl,
        success: function (data) {
            console.log("Notes dock Reloaded." + data);
            $("#notesContent").html(data);
        },
        failure: function(data) {
            console.log("Failure when reloading notes dock." + data);
        }
    });}

控制器:

[HttpGet]
public IActionResult OnGetReloadNotesDock(string objectType, int targetId)
{
   NotesFactoryCategoryEnums notesType = this.MapObjectTypeToCategoryEnum(objectType);
   return ViewComponent("NotesDock", new { notes = new List<NoteModels>(), notesType, targetId });
}

查看组件:

[ViewComponent(Name = "NotesDock")]
public class NotesDockViewComponent : ViewComponent
{
      public async Task<IViewComponentResult> InvokeAsync(List<NoteModels> notes, NotesFactoryCategoryEnums notesType, int targetId, ISession context = null)
      {
            //for unit-testing we pass in an instance of HttpContext.Session to allow for mocking the environment
            if (context == null)
            {
                context = HttpContext.Session;
            }

            string rootUrl = context.Get<string>(SessionConstants.WebServicesUrl);
            string encodedId = context.Get<string>(SessionConstants.EncodedUserId);
            UserModel user = context.Get<UserModel>(SessionConstants.CurrentUser);

            var unsortedNotes = await new NotesFactory().GetAllNotesForTarget(notesType, targetId, user.Email, encodedId, rootUrl);
            List<NoteModels> sortedNotes = new NotesServices().SortNotes(unsortedNotes);
            context.Set<List<NoteModels>>(SessionConstants.Notes, sortedNotes);

            ViewData[SessionConstants.Notes] = context.Get<List<NoteModels>>(SessionConstants.Notes);
               
            return View(sortedNotes);
        }
}

我花了一些时间在谷歌上搜索这个问题,看看其他人是如何从控制器调用视图组件的,它似乎都使用了与我相同的 return 视图组件。错误消息提示它找不到我不理解的 viewcomponent,因为标记方法可以很好地调用 viewcomponent?

任何想法将不胜感激,提前致谢。

图 1:https://i.stack.imgur.com/x1j1F.png

所以...我接受了字面上的错误,并遵循无法找到视图组件的想法(即使 component.invoke() 完美运行)。

我偶然发现了这个:

link 表示运行时在以下路径中搜索视图:

  • "/Views/{控制器名称}/Components/{视图组件名称}/{视图名称}"

  • "/Views/Shared/Components/{视图组件名称}/{视图名称}"

  • "/Pages/Shared/Components/{视图组件名称}/{视图名称}"

在我们的项目中,我们在任何这些位置都没有视图组件。我们的路径是“/Pages/Components/{View Component Name}/{View Name}”

这让我质疑为什么调用函数根本找不到视图组件!

根据该问题中提供的答案,我将以下内容添加到 startup.cs:

    services.Configure<RazorViewEngineOptions>(o =>
    {
         o.ViewLocationFormats.Add("Pages/{0}" + RazorViewEngine.ViewExtension);
    });

现在可以通过控制器中的 ViewComponent 方法正确找到视图组件。所以问题解决了!

似乎 Component.Invoke() 和 ViewComponent() 搜索视图组件的方式略有不同?