具有相同 select 标签助手的两个分部视图无法正常工作
Two Partial Views with the same select tag helper not working
我有一个 Bootstrap Tabs menu in a View
. The panels for tab 1 and tab2 have two partial views pv1 and pv2 each of which has a Select tag helper。正如我们所知,标签助手的 asp-for
属性创建了一个 id 和 name 属性,其值与上述文章中解释的相同。现在,当我单击选项卡 1 时,pv1 将使用 select 标签助手呈现。而且,当我单击 tab2 时,pv2 会使用 select 标签助手呈现。两个标签助手是相同的(年份列表)但是年份在 tab1 和 tab2 中分别被 selected 用于不同的目的。 问题:无论 select 在 pv1 select 标签助手中编辑什么年份,pv2 中的数据都是根据那一年过滤的,而不是根据那一年的用户过滤 selects on pv2 select 标签助手。 问题:为什么?我该如何解决这个问题?如何测试:当我在 pv2 中单击 GO
按钮时,下面的 Ajax 代码总是弹出带有年份 selected 的警报,在 pv2 的 select 标签助手中。
请注意真实场景有两个以上的选项卡,每个选项卡面板中的部分视图具有相同的select标签助手和相同的GO
按钮。我正在使用 JQuery 的 Event Delegation 来简化我的代码,而不是为每个 GO
按钮编写单独的 Ajax 调用。此外,在我的 ViewModel
- 传递给视图 - 我只想使用一个 属性 作为年份列表和 selected 年份。
ViewModel:
public int entityid {get; set;}
...
public SelectList lstYears {get; set;}
public int SelectedYear {get; set;}
...
查看:
<ul id="myTabstripID" class="nav nav-tabs">
<li id="AddprojTab"><a data-toggle="tab" href="#menu1">Menu 1</a></li>
<li id="UpdPorjTab"><a data-toggle="tab" href="#menu2">Menu 2</a></li>
</ul>
<div class="tab-content">
<div id="menuAP" class="tab-pane in active">
<div class="AddTabContenData"></div>
</div>
<div id="menuUP" class="tab-pane in active">
<div class="UpdTabContenData"></div>
</div>
</div>
部分视图 1:
...some html here
Select Order Year: <select asp-for="SelectedYear" asp-items="@Model.lstYears"></select><button type="button" class="btnGO btn btn-default">GO</button>
...some html here to display data based on year selected in pv1
部分视图 2:
...some html here
Select Delivery Year: <select asp-for="SelectedYear" asp-items="@Model.lstYears"></select><button type="button" class="btnGO btn btn-default">GO</button>
...some html here to display data based on year selected in pv2
Ajax代码:
$(document).ready(function () {
$('.tab-content').on('click', '.btnGO', function (event) {
var btnVal = $(this).val();
var selectedYearVal = $('#SelectedYear').val();
alert(selectedYearVal);
$.ajax({
...
...
});
});
});
您有重复的 id
属性(您的 <select>
元素都有 id="SelectedYear"
),这是无效的 html 并且在您的脚本中
var selectedYearVal = $('#SelectedYear').val();
只会 return 第一个元素 id="SelectedYear"
的值。
理想情况下,您应该使用具有不同 属性 名称的视图模型(asp-for
根据 属性 的名称生成 id
属性),但如果不是实际的,你可以在html中指定属性,例如
<select asp-for="SelectedYear" id="someValue" ... >
但是,由于每个部分中都有一个 <button class="btnGO" ... >
元素,您应该删除 id
属性并使用 class 名称,然后使用相对选择器。你的部分应该有一个容器元素,比如
<div class="container">
<select asp-for="SelectedYear" asp-items="@Model.lstYears" class="year" id=""></select>
<button type="button" class="btnGO btn btn-default">GO</button>
....
</div>
并修改脚本以获取下拉列表中相对于按钮的选定选项
$(document).ready(function () {
$('.tab-content').on('click', '.btnGO', function (event) {
// var btnVal = $(this).val();
var container = $(this).closest('.container');
var selectedYearVal = container.find('.year').val();
$.ajax({
...
});
});
});
另请注意,var btnVal = $(this).val();
没有意义,因为 <button>
没有 value
属性
我有一个 Bootstrap Tabs menu in a View
. The panels for tab 1 and tab2 have two partial views pv1 and pv2 each of which has a Select tag helper。正如我们所知,标签助手的 asp-for
属性创建了一个 id 和 name 属性,其值与上述文章中解释的相同。现在,当我单击选项卡 1 时,pv1 将使用 select 标签助手呈现。而且,当我单击 tab2 时,pv2 会使用 select 标签助手呈现。两个标签助手是相同的(年份列表)但是年份在 tab1 和 tab2 中分别被 selected 用于不同的目的。 问题:无论 select 在 pv1 select 标签助手中编辑什么年份,pv2 中的数据都是根据那一年过滤的,而不是根据那一年的用户过滤 selects on pv2 select 标签助手。 问题:为什么?我该如何解决这个问题?如何测试:当我在 pv2 中单击 GO
按钮时,下面的 Ajax 代码总是弹出带有年份 selected 的警报,在 pv2 的 select 标签助手中。
请注意真实场景有两个以上的选项卡,每个选项卡面板中的部分视图具有相同的select标签助手和相同的GO
按钮。我正在使用 JQuery 的 Event Delegation 来简化我的代码,而不是为每个 GO
按钮编写单独的 Ajax 调用。此外,在我的 ViewModel
- 传递给视图 - 我只想使用一个 属性 作为年份列表和 selected 年份。
ViewModel:
public int entityid {get; set;}
...
public SelectList lstYears {get; set;}
public int SelectedYear {get; set;}
...
查看:
<ul id="myTabstripID" class="nav nav-tabs">
<li id="AddprojTab"><a data-toggle="tab" href="#menu1">Menu 1</a></li>
<li id="UpdPorjTab"><a data-toggle="tab" href="#menu2">Menu 2</a></li>
</ul>
<div class="tab-content">
<div id="menuAP" class="tab-pane in active">
<div class="AddTabContenData"></div>
</div>
<div id="menuUP" class="tab-pane in active">
<div class="UpdTabContenData"></div>
</div>
</div>
部分视图 1:
...some html here
Select Order Year: <select asp-for="SelectedYear" asp-items="@Model.lstYears"></select><button type="button" class="btnGO btn btn-default">GO</button>
...some html here to display data based on year selected in pv1
部分视图 2:
...some html here
Select Delivery Year: <select asp-for="SelectedYear" asp-items="@Model.lstYears"></select><button type="button" class="btnGO btn btn-default">GO</button>
...some html here to display data based on year selected in pv2
Ajax代码:
$(document).ready(function () {
$('.tab-content').on('click', '.btnGO', function (event) {
var btnVal = $(this).val();
var selectedYearVal = $('#SelectedYear').val();
alert(selectedYearVal);
$.ajax({
...
...
});
});
});
您有重复的 id
属性(您的 <select>
元素都有 id="SelectedYear"
),这是无效的 html 并且在您的脚本中
var selectedYearVal = $('#SelectedYear').val();
只会 return 第一个元素 id="SelectedYear"
的值。
理想情况下,您应该使用具有不同 属性 名称的视图模型(asp-for
根据 属性 的名称生成 id
属性),但如果不是实际的,你可以在html中指定属性,例如
<select asp-for="SelectedYear" id="someValue" ... >
但是,由于每个部分中都有一个 <button class="btnGO" ... >
元素,您应该删除 id
属性并使用 class 名称,然后使用相对选择器。你的部分应该有一个容器元素,比如
<div class="container">
<select asp-for="SelectedYear" asp-items="@Model.lstYears" class="year" id=""></select>
<button type="button" class="btnGO btn btn-default">GO</button>
....
</div>
并修改脚本以获取下拉列表中相对于按钮的选定选项
$(document).ready(function () {
$('.tab-content').on('click', '.btnGO', function (event) {
// var btnVal = $(this).val();
var container = $(this).closest('.container');
var selectedYearVal = container.find('.year').val();
$.ajax({
...
});
});
});
另请注意,var btnVal = $(this).val();
没有意义,因为 <button>
没有 value
属性