从下拉列表中选择时显示Microsoft边缘"Leave Site"消息



我有一个使用Razor的继承MVC5 web应用程序,当页面加载时,会显示两个下拉菜单、一些数据和五个按钮,其中一个按钮被禁用(保存(。当我从第一个下拉菜单中选择不同的选项时,应该显示一个带有日期选择器的输入字段,以及一个";OK";按钮;保存";按钮应该已启用。这在IE 11中运行良好,但在Microsoft Edge中,会出现一条消息,询问";离开现场?您所做的更改可能无法保存"如果我点击";离开"按钮,微调器出现,我停留在页面上。

在IE 11中,当从第一个下拉列表中选择任何其他选项时,会出现微调器,页面会重新加载带有日期选择器的输入字段,但会出现"确定"按钮,并启用"保存"按钮。只有当单击后退按钮时才会显示类似的消息。

我浏览了代码,发现了以下内容:

第一个下拉菜单的代码:

@Html.DropDownListFor(m => m.StatusId, new SelectList(Model.StatusList, "Value", "Text", Model.StatusId), new { @class = "form-control", @id = "StatusList"})

我还发现了一个隐藏的提交按钮:

@Html.HiddenFor(m => m.CurrentTypeName, htmlAttributes: new { id = "CurrentTypeName" })
<input id="FinalizeValidationButton" type="submit" name="action:FinalizeValidation" style="visibility:hidden" />

在一个javascript文件中,我发现了以下内容:

//This is the first dropdown mentioned above
$('#StatusList').change(
function () {
triggerFinalizeValidation();
setVisibility();
});
var triggerFinalizeValidation = function () {
var selectedStatus = $('#StatusList').val();
$("#CurrentSignificantActivityTypeName").val($("div.active").prop("id"));
if (selectedStatus != 1) {
navParams.userAction = true;
$('#finalizeButton').prop('disabled', true);
navParams.isDirty = false;
$('#FinalizeValidationButton').trigger('click');
}};

因此,用户从第一个下拉列表(StatusList(中选择了一个不同的选项,该选项会触发$("#StatusList"(.change,进而调用triggerFinalizeValidation((,后者又会向隐藏的提交按钮("FinalizeVValidationButton"(添加一个单击事件。无论出于何种原因,它都会触发类似回发的响应,这会导致Microsoft Edge认为用户试图离开当前页面,而事实并非如此。

单击隐藏按钮时,会在RiskController.ca中执行以下代码。除了前面提到的字段/按钮外,屏幕上还有许多下拉菜单、字段等。因此,代码的这一部分验证了用户所选择的内容,并根据所选内容进行peforms计算。当我在JavaScript中注释掉点击事件时,浏览器消息不会显示,但FinalizeValidation方法也不会执行。

[AcceptVerbs(HttpVerbs.Post)]
[MultiButtonAction(Name = "action", Argument = "FinalizeValidation")]
public ActionResult FinalizeValidation(RiskViewModel viewModel)
{
string currentActivityTypeName = viewModel.CurrentActivityTypeName;
var risk = _riskRepository.FindFull(viewModel.Id);

我想知道是否有一种方法可以在下拉列表中使用@onchange,以某种方式调用控制器中的FinalizeValidation方法,看看是否可以解决浏览器消息的出现。。。想法?

我最终使用了

$(window).off('beforeunload');

之后

$('#FinalizeValidationButton').trigger('click');

这解决了问题。

最新更新