gpt4 book ai didi

javascript - ASP.NET MVC Core - 具有动态加载的 PartialView 的 JavaScript 事件处理程序

转载 作者:太空宇宙 更新时间:2023-11-04 15:48:47 25 4
gpt4 key购买 nike

<分区>

我的 View 文件中有这个脚本,它的目的是填充同一 View 的一部分,但只是其中的一小部分,这是一个带有 Bootstrap 面板类的 HTML div:

<script type="text/javascript">
function GetVehicles() {
$.get('@Context.Request.Scheme://@hostname/@controller/GetVehicles', {id: @Model.Id}, function (response) {
$("#tabOutVehicles").html(response);
});
}

function GetMedInfo() {
$.get('@Context.Request.Scheme://@hostname/@controller/GetMedInfo', {id: @Model.Id}, function (response) {
$("#tabOutMedInfo").html(response);

});
}
</script>

我的完整 View ,它将显示上面脚本生成的输出:

    @{
Layout = "~/Views/Shared/_Layout.cshtml";
}
<script src="~/js/site.js"></script>

<div class="panel panel-primary">
<div class="panel-heading">
<a href="#collapseVehicles" class="btn student-dash-btn" onclick="GetVehicles()" data-toggle="collapse">Vehicles</a>
</div>

<div id="collapseVehicles" class="panel-collapse collapse">
<div id="tabOutVehicles">
</div>
</div>
</div>

<div class="panel panel-primary">
<div class="panel-heading">
<a href="#collapseMedInfo" class="btn student-dash-btn" onclick="GetMedInfo()" data-toggle="collapse"><strong style="color:white">Medical Info</strong></a>
</div>

<div id="collapseMedInfo" class="panel-collapse collapse">
<div id="tabOutMedInfo">
</div>
</div>
</div>

<script type="text/javascript">
function GetVehicles() {
$.get('@Context.Request.Scheme://@hostname/@controller/GetVehicles', {id: @Model.Id}, function (response) {
$("#tabOutVehicles").html(response);
});
}

function GetMedInfo() {
$.get('@Context.Request.Scheme://@hostname/@controller/GetMedInfo', {id: @Model.Id}, function (response) {
$("#tabOutMedInfo").html(response);

});
}
</script>

通过单击 Bootstrap 面板 div 内的超链接,jQuery 方法会触发我的 Controller 操作,返回响应,然后将响应放入适用的 div (#tabOutMedInfo/#tabOutVehicles)。这两个操作都返回部分 View 。这是我的部分 View 的样子,除了模型属性不同外,两者看起来都一样:

@model MyViewModel
<div class="panel-body">
<a data-url="@Url.Action("EditMedInfo", "Controller", new { id = Model.Id })" data-toggle="ajax-modal" data-target="#EditMedInfo" class="btn btn-default">Edit</a>

<div class="form-horizontal">
<div class="">
<div class="form-group">
<div class="col-md-5 col-sm-5 col-xs-5"><label asp-for="Variable" class="control-label"></label></div>
<div class="col-md-7 col-sm-7 col-xs-7">
@Html.DisplayFor(item => item.Variable)
</div>
</div>
</div>
</div>
</div>

当点击上面的超链接时,它应该执行加载模态以进行编辑的 JavaScript 代码,但这并没有发生,而是它不会打开模态。 JavaScript 代码位于我的 site.js 文件中,该文件正在我的主视图中导入。

我尝试过的:
我将脚本导入标签移动到我的两个部分 View ,然后将其从我的 View 中删除,然后它会导致 JavaScript 代码运行并显示我的模式,但这个解决方案只工作了一段时间。

新问题:
然后一个新的问题开始出现,如果第一个局部 View 被加载,而你在没有关闭网页的情况下加载第二个局部 View ,它会导致 site.js 被加载到 View 中两次,一次是第一个局部 View ,第二次通过第二个局部 View 。加载 site.js 两次后,它会以某种方式导致我的发布操作被命中两次,从而导致为一个发布操作插入两次数据。

然后我决定将 site.js 移动到我的 _Layout.cshtml(理想情况下它应该如何)并再次尝试,这种方式导致部分 View 像正常一样呈现,但再一次,模态没有显示单击部分 View 中的超链接。

我的理论:
按照我的理解,当 jQuery get 方法加载局部 View 时,它会阻止局部 View 看到 site.js,即使它是由我的 _Layout.cshtml 加载的。

我最好不想改变的是:
我不想摆脱我的小 get 操作,我这样构建它是为了让我的用户尽可能多地停留在一个页面上,并且单独调用 get 操作可以减少他们的数据使用量。

我是否正确加载了 site.js?为什么我的局部 View 看不到 site.js?

编辑:
这是我的_Layout.cshtml

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>@ViewBag.Title</title>
<environment names="Development">
@*Other scripts omitted *@
<script src="~/js/site.js" asp-append-version="true" defer></script>
</environment>

<environment names="Staging,Production">
@*Other scripts omitted *@
<script src="~/js/site.js" asp-append-version="true" defer></script>
</environment>
</head>
<body>
<div id="modal-placeholder"></div>
@RenderBody()
@RenderSection("scripts", required: false)
</body>
</html>

这是 site.js 中的 JavaScript 代码:

$(function () {
var placeholderElement = $('#modal-placeholder');
var redirectUrl = "";

$('a[data-toggle="ajax-modal"]').click(function (event) {
var url = $(this).data('url');
redirectUrl = window.location.href;

$.get(url).done(function (data) {
placeholderElement.html(data);
placeholderElement.find('.modal').modal('show');
});
});

placeholderElement.on('click', '[data-save="modal"]', function (event) {
event.preventDefault();

var form = $(this).parents('.modal').find('form');
var actionUrl = form.attr('action');
var dataToSend = form.serialize();

$.post(actionUrl, dataToSend).done(function (data) {
var newBody = $('.modal-body', data);
placeholderElement.find('.modal-body').replaceWith(newBody);
var isValid = newBody.find('[name="IsValid"]').val() == 'True';
if (isValid) {
placeholderElement.find('.modal').modal('hide');
window.location.assign(redirectUrl);
}
}
});
});
});

JavaScript 的编写方式与上面类似,用于处理模态框上的服务器端验证,请参阅此处的精彩文章:https://softdevpractice.com/blog/asp-net-core-mvc-ajax-modals/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com