部分视图在关闭后仍然有效
Partial view remains active after close
我有一个视图,其中有一个 kendo-网格,在这个网格中有一个按钮可以打开细节 window。当按下按钮时,详细信息 window 打开,这是一个 kendo-window,它呈现局部视图。当我关闭 kendo-window 时,我销毁它并将其设置为空。但是,我的视图和部分视图上都有一个 JavaScript 函数,可以捕获扫描仪的输入。如果我在打开局部视图的 window 时扫描,视图上的函数什么都不做,但是当我关闭局部视图时,局部视图上的 JavaScript 函数仍然捕获我的扫描并尝试一次处理两个页面的扫描。我怎样才能确保局部视图真的关闭了,这样它就不会捕获我的扫描输入(最好使用 JavaScript)。
局部视图动作方法:
public ActionResult GetKendoWindow(int ID, int PID)
{
//fill and return partial view locationswindow
ViewBag.ID = ID;
ViewBag.PID = PID;
IEnumerable<BinLocationItemModel> model = dbLogic.getItemLocations(PID, ID);
return PartialView("_PartialViewLocation", model);
}
Kendo-window:
function showDetails(e) {
e.preventDefault();
if (wnd) {
wnd.close();
}
var dataItem = this.dataItem($(e.currentTarget).closest("tr"));
wndOpen = 1;
$("#detcont").append("<div id='Details'></div>");
wnd = $("#Details").kendoWindow({
width: "60%",
height: "60%",
actions: ["Minimize", "Maximize", "Close"],
title: "Location Data for: " + dataItem.ArticleID,
content: {
url: "GetKendoWindow",
type: "GET",
data: { ID: dataItem.LineNum, PID: dataItem.PickID }
},
close: function (e) {
wnd.destroy();
wnd = null;
setWindowInactive();
}
}).data("kendoWindow");
wnd.center().open();
}
function setWindowInactive(e) {
wndOpen = 0;
}
局部视图 JS:
<script type="text/javascript">
//Scanner opvangen
$(document).ready(function () {
if ($('#ItemLocGrid') != null) {
var pressed = false;
var chars = [];
var grid = $('#ItemLocGrid').data('kendoGrid');
var dataitem = grid.dataItem(grid.select());
$(window).keypress(function (e) {
if (e.which >= 48 && e.which <= 57) {
if (chars.length < 3) {
// do nothing
} else {
$('.focus :input').focus();
}
chars.push(String.fromCharCode(e.which));
}
if (pressed == false) {
setTimeout(function () {
if (chars.length >= 5) {
var barcode = chars.join("");
document.getElementById("txtBarcodes").value = barcode;
$('.focus :input').submit();
}
chars = [];
pressed = false;
document.getElementById("txtBarcodes").value = "";
}, 200);
}
pressed = true;
});
}
});
$('#txtBarcodes').submit(function (e) {
var grid = $("#ItemLocGrid").data("kendoGrid");
var dataSource = $("#ItemLocGrid").data("kendoGrid").dataSource;
var allData = grid.dataSource.data();
var code = this.value;
var notification = $("#notification").data("kendoNotification");
console.log("Nothing to see here");
})
清空 html
里面的 Details
div:
close: function (e) {
. . .
$("#Details").html("");
. . .
}
return PartialView("_PartialViewLocation", model);
在做什么,只是返回生成的 html,从您的部分视图。
更新
这里真正的问题是,您应该避免在局部中引用任何脚本。因此,您需要在布局中的某处定义一个部分,例如在结束 </body>
之前,这将允许视图(不是部分)包含一些自定义脚本。然后在视图中(不是部分)您可以覆盖此部分以包含自定义脚本:
@section scripts {
<script src="@Url.Content("~/Scripts/Custom.js")" type="text/javascript"></script>
}
它与 SeM 提到的不完全一样,但他的代码给了我修复它的想法。我所做的是将我的 JavaScript 代码从我的部分视图放入我的视图(而不是布局),我没有意识到我的视图能够读取 kendo-grid 而无需实际包含它在它的代码中,但它实际上可以。之后,只需检查 window 是否打开并处理部分视图或视图的扫描。
我有一个视图,其中有一个 kendo-网格,在这个网格中有一个按钮可以打开细节 window。当按下按钮时,详细信息 window 打开,这是一个 kendo-window,它呈现局部视图。当我关闭 kendo-window 时,我销毁它并将其设置为空。但是,我的视图和部分视图上都有一个 JavaScript 函数,可以捕获扫描仪的输入。如果我在打开局部视图的 window 时扫描,视图上的函数什么都不做,但是当我关闭局部视图时,局部视图上的 JavaScript 函数仍然捕获我的扫描并尝试一次处理两个页面的扫描。我怎样才能确保局部视图真的关闭了,这样它就不会捕获我的扫描输入(最好使用 JavaScript)。
局部视图动作方法:
public ActionResult GetKendoWindow(int ID, int PID)
{
//fill and return partial view locationswindow
ViewBag.ID = ID;
ViewBag.PID = PID;
IEnumerable<BinLocationItemModel> model = dbLogic.getItemLocations(PID, ID);
return PartialView("_PartialViewLocation", model);
}
Kendo-window:
function showDetails(e) {
e.preventDefault();
if (wnd) {
wnd.close();
}
var dataItem = this.dataItem($(e.currentTarget).closest("tr"));
wndOpen = 1;
$("#detcont").append("<div id='Details'></div>");
wnd = $("#Details").kendoWindow({
width: "60%",
height: "60%",
actions: ["Minimize", "Maximize", "Close"],
title: "Location Data for: " + dataItem.ArticleID,
content: {
url: "GetKendoWindow",
type: "GET",
data: { ID: dataItem.LineNum, PID: dataItem.PickID }
},
close: function (e) {
wnd.destroy();
wnd = null;
setWindowInactive();
}
}).data("kendoWindow");
wnd.center().open();
}
function setWindowInactive(e) {
wndOpen = 0;
}
局部视图 JS:
<script type="text/javascript">
//Scanner opvangen
$(document).ready(function () {
if ($('#ItemLocGrid') != null) {
var pressed = false;
var chars = [];
var grid = $('#ItemLocGrid').data('kendoGrid');
var dataitem = grid.dataItem(grid.select());
$(window).keypress(function (e) {
if (e.which >= 48 && e.which <= 57) {
if (chars.length < 3) {
// do nothing
} else {
$('.focus :input').focus();
}
chars.push(String.fromCharCode(e.which));
}
if (pressed == false) {
setTimeout(function () {
if (chars.length >= 5) {
var barcode = chars.join("");
document.getElementById("txtBarcodes").value = barcode;
$('.focus :input').submit();
}
chars = [];
pressed = false;
document.getElementById("txtBarcodes").value = "";
}, 200);
}
pressed = true;
});
}
});
$('#txtBarcodes').submit(function (e) {
var grid = $("#ItemLocGrid").data("kendoGrid");
var dataSource = $("#ItemLocGrid").data("kendoGrid").dataSource;
var allData = grid.dataSource.data();
var code = this.value;
var notification = $("#notification").data("kendoNotification");
console.log("Nothing to see here");
})
清空 html
里面的 Details
div:
close: function (e) {
. . .
$("#Details").html("");
. . .
}
return PartialView("_PartialViewLocation", model);
在做什么,只是返回生成的 html,从您的部分视图。
更新
这里真正的问题是,您应该避免在局部中引用任何脚本。因此,您需要在布局中的某处定义一个部分,例如在结束 </body>
之前,这将允许视图(不是部分)包含一些自定义脚本。然后在视图中(不是部分)您可以覆盖此部分以包含自定义脚本:
@section scripts {
<script src="@Url.Content("~/Scripts/Custom.js")" type="text/javascript"></script>
}
它与 SeM 提到的不完全一样,但他的代码给了我修复它的想法。我所做的是将我的 JavaScript 代码从我的部分视图放入我的视图(而不是布局),我没有意识到我的视图能够读取 kendo-grid 而无需实际包含它在它的代码中,但它实际上可以。之后,只需检查 window 是否打开并处理部分视图或视图的扫描。