【发布时间】: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);
}
}
我花了一些时间在谷歌上搜索这个问题,看看其他人是如何从控制器调用视图组件的,这一切似乎都使用了与我相同的返回视图组件。错误消息表明它找不到我不理解的视图组件,因为标记方法完全可以调用视图组件?
任何想法都将不胜感激,在此先感谢。
【问题讨论】:
-
打开查看页面并匹配您输入的姓名:hidden[name="__RequestVerificationToken"]'
-
很遗憾没有工作,不过还是感谢您的意见!我设法弄清楚了,如果您有兴趣,请参阅下面的答案:)
标签: c# asp.net-mvc razor controller asp.net-core-viewcomponent