在另一个 ViewComponent 中调用一个 ViewComponent
Invoking a ViewComponent within another ViewComponent
我目前正在 ViewComponent
(ViewComponent1) 视图中编码。在此视图中,我列出了一些项目:
如您所见,频道11、12、13和14是可以点击的。每个通道都有一些附加信息(OBIS、avtalsid 等)。我想做的是在 ViewComponent1 中调用 ViewComponent2,并根据单击的项目传递一些数据。
我试图做的是创建另一个名为 "Test" 的 View
并在其中 View
调用 ViewComponent2 及其参数,如下所示:
<div class="row">
<div class="col-md-2 canalstyle">
<a asp-controller="Customer" asp-action="Test" asp-route-pod="@item.STATION"
asp-route-idnr="@item.IDNR" asp-route-kanal="@item.KANAL" asp-route-start="@Model.start"
asp-route-end="@Model.end"> @Html.DisplayFor(modelItem => item.KANAL)</a>
</div>
</div>
这行得通,但此方法将我重定向到当前 View
(ViewComponent 1)。我不想要那个。我希望当前视图从 ViewComponent2 加载附加信息。
我运行 ajax 的函数:
function myFunction() {
var data = JSON.stringify({
'idnr': id,
'start': this.start,
'end': this.end
});
$.ajax({
url: '@Url.Action("Test2","Customer")',
type: 'GET',
data: { idnr: id, start: this.start, end: this.end },
contentType: 'application/json',
success: handleData(data)
})
};
function handleData(data) {
alert(data);
var url = $(this).attr("href");
var $target = $(this).closest("div").find(".details");
$.get(url, function (res) {
$target.html(res);
});
//do some stuff
}
我的 Test2 操作:
public async Task<IActionResult> Test2(string idnr, string start, string end)
{
ServiceClient r2s = new R2S.ServiceClient();
R2S.Konstant[] kData = r2s.GetKonstantListAsync(new string[] { "IDNR" }, new string[] { idnr}).Result; // mätarnummer in... --> alla konstanter kopplade till denna.
return ViewComponent("MeterReader2", new { k = kData[0], start = start, end = end });
}
我正在尝试以相同的目标 DOM..有什么想法吗?
您当前的代码正在呈现 links(a 标签),通常单击 link 会执行一个新的 GET 请求,这就是您所看到的,重定向到新操作方法。
如果你不想重定向,但想在同一个视图中显示第二个视图组件的结果,你应该使用 ajax.
例如,如果您想在每个 link 下方显示第二个视图组件的结果,您可以为此添加另一个 html 元素。我在这里添加一个空的 div.
<div class="row">
<div class="col-md-2 canalstyle">
<a class="myClass" asp-controller="Customer" asp-action="DetailsVc"
asp-route-id="@item.Id" > @item.KANAL</a>
<div class="details"></div>
</div>
</div>
在这里,我只是删除了您在原始问题中的所有路由参数,并仅替换为 on param (id
) 。假设您的项目将有一个 Id
属性 ,它是记录(主键)的唯一 ID,您可以使用它在视图组件中获取实体(来自数据库左右)以获取详情。
这将生成 link 和 css class myClass
。你可以看到,我使用 asp-action
属性值作为 "DetailsVc"。我们不能直接使用 link 标签助手中的视图组件名称作为属性值来生成 href
值。所以我们应该创建一个包装器操作方法,returns 您的视图组件结果如下
public IActionResult DetailsVc(int id)
{
return ViewComponent("DetailsComponent", new { id =id });
}
假设您的第二个视图组件名称是 DetailsComponent
并且它接受一个 id
参数。根据需要更新此操作方法和视图组件的参数列表。 (但我建议只传递唯一的 Id 值并再次在服务器代码中获取详细信息)
现在您所要做的就是编写一些 javascript 代码来侦听那些 a 标签上的 click
事件并防止正常行为(重定向)并生成 ajax改为调用,使用 ajax 调用结果更新单击的 link 旁边的详细信息 div。
您可以将此代码放在主视图中(或放在没有 @section
部分的外部 js 文件中)
@section Scripts
{
<script>
$(function() {
$("a.myClass").click(function(e) {
e.preventDefault();
var url = $(this).attr("href");
var $target = $(this).closest("div").find(".details");
$.get(url,function(res) {
$target.html(res);
});
});
});
</script>
}
我目前正在 ViewComponent
(ViewComponent1) 视图中编码。在此视图中,我列出了一些项目:
如您所见,频道11、12、13和14是可以点击的。每个通道都有一些附加信息(OBIS、avtalsid 等)。我想做的是在 ViewComponent1 中调用 ViewComponent2,并根据单击的项目传递一些数据。
我试图做的是创建另一个名为 "Test" 的 View
并在其中 View
调用 ViewComponent2 及其参数,如下所示:
<div class="row">
<div class="col-md-2 canalstyle">
<a asp-controller="Customer" asp-action="Test" asp-route-pod="@item.STATION"
asp-route-idnr="@item.IDNR" asp-route-kanal="@item.KANAL" asp-route-start="@Model.start"
asp-route-end="@Model.end"> @Html.DisplayFor(modelItem => item.KANAL)</a>
</div>
</div>
这行得通,但此方法将我重定向到当前 View
(ViewComponent 1)。我不想要那个。我希望当前视图从 ViewComponent2 加载附加信息。
我运行 ajax 的函数:
function myFunction() {
var data = JSON.stringify({
'idnr': id,
'start': this.start,
'end': this.end
});
$.ajax({
url: '@Url.Action("Test2","Customer")',
type: 'GET',
data: { idnr: id, start: this.start, end: this.end },
contentType: 'application/json',
success: handleData(data)
})
};
function handleData(data) {
alert(data);
var url = $(this).attr("href");
var $target = $(this).closest("div").find(".details");
$.get(url, function (res) {
$target.html(res);
});
//do some stuff
}
我的 Test2 操作:
public async Task<IActionResult> Test2(string idnr, string start, string end)
{
ServiceClient r2s = new R2S.ServiceClient();
R2S.Konstant[] kData = r2s.GetKonstantListAsync(new string[] { "IDNR" }, new string[] { idnr}).Result; // mätarnummer in... --> alla konstanter kopplade till denna.
return ViewComponent("MeterReader2", new { k = kData[0], start = start, end = end });
}
我正在尝试以相同的目标 DOM..有什么想法吗?
您当前的代码正在呈现 links(a 标签),通常单击 link 会执行一个新的 GET 请求,这就是您所看到的,重定向到新操作方法。
如果你不想重定向,但想在同一个视图中显示第二个视图组件的结果,你应该使用 ajax.
例如,如果您想在每个 link 下方显示第二个视图组件的结果,您可以为此添加另一个 html 元素。我在这里添加一个空的 div.
<div class="row">
<div class="col-md-2 canalstyle">
<a class="myClass" asp-controller="Customer" asp-action="DetailsVc"
asp-route-id="@item.Id" > @item.KANAL</a>
<div class="details"></div>
</div>
</div>
在这里,我只是删除了您在原始问题中的所有路由参数,并仅替换为 on param (id
) 。假设您的项目将有一个 Id
属性 ,它是记录(主键)的唯一 ID,您可以使用它在视图组件中获取实体(来自数据库左右)以获取详情。
这将生成 link 和 css class myClass
。你可以看到,我使用 asp-action
属性值作为 "DetailsVc"。我们不能直接使用 link 标签助手中的视图组件名称作为属性值来生成 href
值。所以我们应该创建一个包装器操作方法,returns 您的视图组件结果如下
public IActionResult DetailsVc(int id)
{
return ViewComponent("DetailsComponent", new { id =id });
}
假设您的第二个视图组件名称是 DetailsComponent
并且它接受一个 id
参数。根据需要更新此操作方法和视图组件的参数列表。 (但我建议只传递唯一的 Id 值并再次在服务器代码中获取详细信息)
现在您所要做的就是编写一些 javascript 代码来侦听那些 a 标签上的 click
事件并防止正常行为(重定向)并生成 ajax改为调用,使用 ajax 调用结果更新单击的 link 旁边的详细信息 div。
您可以将此代码放在主视图中(或放在没有 @section
部分的外部 js 文件中)
@section Scripts
{
<script>
$(function() {
$("a.myClass").click(function(e) {
e.preventDefault();
var url = $(this).attr("href");
var $target = $(this).closest("div").find(".details");
$.get(url,function(res) {
$target.html(res);
});
});
});
</script>
}