2016-08-23 8 views
0

Я знаю, что есть много вопросов, подобных этому, но я не вижу ничего такого. У меня есть страница ASPX и использование javascript для отображения всплывающего окна подтверждения. При нажатии на кнопку значение, которое я нажимаю, не используется, но вместо этого используется предыдущее значение. Поэтому, если я нажму OK, первый раз он отменяется. Если я нажму OK еще раз, тогда он переходит в состояние «ОК», если я нажму «Отменить», он все равно переходит в «ОК», я снова нажимаю «Отменить», и он отменяется. Я уверен, что это проблема с Postback, но я не знаю, как ее разрешить, так как я не звоню на javascript при нажатии кнопки, но позже. Я использую свой код позади, чтобы определить, является ли запись дубликатом, и поэтому я показываю всплывающее окно, позволяющее пользователю узнать, и дать им возможность принять или отменить. Если дубликат отсутствует, скрипт для всплывающего окна не будет вызван. Итак, как мне решить эту проблему?Postback Issue with Javascript Popup

Javascript в моей ASPX

function Confirm() { 
    var confirm_value = document.createElement("INPUT"); 
    confirm_value.type = "hidden"; 
    confirm_value.name = "confirm_value"; 
    if (confirm("Duplicate Record. Do you want to save?")) { 
     confirm_value.value = "Yes"; 
    } else { 
     confirm_value.value = "No"; 
    } 
    document.forms[0].appendChild(confirm_value); 
} 

Это код из моей CS, вызывается из метода после проверки условий.

ScriptManager.RegisterStartupScript(this, base.GetType(), "confirmation", "Confirm();", true); 
string confirmValue = Request.Form["confirm_value"]; 
if (confirmValue == "Yes") 
{ 
    this.Page.ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('You clicked YES!')", true); 
} 
else 
{ 
    this.Page.ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('You clicked NO!')", true); 
} 

Примечание: Я использую AutoPostBack несколько полей на той же странице, что сво форма ввода данных и в зависимости от того, что выбрано для одного поля зависит от того, как будет заполняться другое поле.

+0

RegisterStartupScript, используемый для добавления js-кода в html со стороны сервера. он не будет выполняться немедленно. только после рендеринга html в браузере. поэтому вы не можете получить confirm_value в это время. –

ответ

0

Вот один из способов сделать это.

В разметке вы можете добавить скрытое поле для проверки дублирования повторяющихся данных. В приведенном ниже примере btnSaveData - это кнопка, которая может уже присутствовать в вашей форме.

<asp:HiddenField ID="hiddenOverwriteData" runat="server" Value="false" /> 
<asp:Button ID="btnSaveData" runat="server" Text="Save data" OnClick="btnSaveData_OnClick" /> 

Обработчик события щелчка на кнопке должен проверить, существуют ли данные. Если это так, клиентский скрипт зарегистрирован; если нет, новые данные сохраняются.

protected void btnSaveData_OnClick(object sender, EventArgs e) 
{ 
    // Check if the data record already exists 
    bool isDuplicate = ... 

    if (isDuplicate) 
    { 
     ScriptManager.RegisterStartupScript(this, this.GetType(), "ConfirmSave", "confirmSaveData();", true); 
    } 
    else 
    { 
     DoSaveData(); 
    } 
} 

private void DoSaveData() 
{ 
    // Actually save the data 
    ... 
} 

Функция Javascript запрашивает подтверждение. Если пользователь подтверждает, значение скрытого поля устанавливается равным true, и форма отправляется снова; если нет, операция сохранения отменяется.

<script type="text/javascript"> 
    function confirmSaveData() { 
     if (confirm("Duplicate data. Do you want to overwrite?")) { 
      var hiddenOverwriteData = document.getElementById('<%= hiddenOverwriteData.ClientID %>'); 
      hiddenOverwriteData.value = 'true'; 
      form1.submit(); 
     } 
    } 
</script> 

В Page_Load, мы проверяем, если пользователь только что подтвердил, что дублирующие данные должны быть перезаписаны, и в этом случае данные сохраняются и значение скрытого поля сбрасывается.

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (hiddenOverwriteData.Value == "true") 
    { 
     hiddenOverwriteData.Value = "false"; 
     DoSaveData(); 
    } 
} 
+0

Отлично! Именно то, что мне было нужно, большое спасибо! – aantiix