【问题标题】:ViewComponent was not found未找到视图组件
【发布时间】:2020-11-06 07:25:45
【问题描述】:

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

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

上面的代码完美运行,视图组件加载完毕。

我想在通过用户创建或更新笔记时重新加载视图组件。为此,我对调用视图组件的控制器进行了 ajax 调用。这行不通。我在图像 1(问题的底部)中得到错误,说即使标记中的调用方法工作正常,也找不到视图组件。

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

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

任何想法都将不胜感激,在此先感谢。

图片一:https://i.stack.imgur.com/x1j1F.png

【问题讨论】:

  • 打开查看页面并匹配您输入的姓名:hidden[name="__RequestVerificationToken"]'
  • 很遗憾没有工作,不过还是感谢您的意见!我设法弄清楚了,如果您有兴趣,请参阅下面的答案:)

标签: c# asp.net-mvc razor controller asp.net-core-viewcomponent


【解决方案1】:

所以...我接受了我得到的错误,并遵循无法找到视图组件的想法(即使 component.invoke() 工作正常)。

我偶然发现了这个: ASP.NET Core MVC View Component search path

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

  • "/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() 搜索视图组件的方式略有不同?

【讨论】:

    猜你喜欢
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 2015-04-03
    • 2012-07-21
    • 2015-05-01
    • 2015-08-28
    相关资源
    最近更新 更多