未找到 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() 搜索视图组件的方式略有不同?
所以我有一个视图组件,它使用以下代码从标记中调用。
@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() 搜索视图组件的方式略有不同?