Я видел много сообщений на эту тему, но до сих пор не могу понять, почему мой код все еще делает это.
У меня есть 1 страница aspx с 2 кнопками. В загрузке страницы я проверяю, загружается ли он впервые, используя (! IsPostBack), и устанавливаю несколько переменных, которые я затем go использую на этой странице.
По какой-то причине я не могу объяснить, что это работало так, как ожидалось, и отлично, но внезапно этот раздел кода теперь срабатывает каждый раз, когда страница перезагружается после нажатия кнопки. Это означает, что переменные обновляются снова и снова, и я теряю данные при каждом нажатии кнопки, а это не то, что я хочу.
Вот веб-форма
<!DOCTYPE html>
<%-- --%>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<script type="text/javascript" src="BrowserTalking.js"></script>
<link href="LandingPage.css" rel="stylesheet" type="text/css" />
<link rel="shortcut icon" href="#"/>
<title>Home Page</title>
</head>
<body onload="speaking();">
<form id="form1" runat="server" class="wholeScreenDiv">
<div class="mainColumn">
<asp:Label ID="questionLabel" runat="server" CssClass="questionText"></asp:Label>
<div class="answerRow">
<asp:Button ID="Button1" runat="server" Text="Yes" CssClass="myButton1" OnClick="Button1_Click" />
<asp:Button ID="Button2" runat="server" Text="No" CssClass="myButton2" OnClick="Button2_Click" />
</div>
</div>
<asp:HiddenField runat="server" ID="questionNumber" />
<asp:HiddenField runat="server" ID="SpeechSynthNeeded" />
</form>
</body>
</html>
Метод JavaScript, называемый onload, просто использует API синтеза речи, и опять-таки это было то же самое, когда он работал идеально.
function speaking() {
var questionNum = document.getElementById("questionNumber").value;
var actualQuestion = "";
var utterance = new SpeechSynthesisUtterance();
utterance.rate = 0.7;
if (document.getElementById("SpeechSynthNeeded").value == "1") {
if (questionNum == 0) {
actualQuestion = 'Can you read and understand this text clearly';
} else if (questionNum == 1) {
actualQuestion = 'Would you still like the information spoken to you?';
} else if (questionNum == 2) {
actualQuestion = "Do you suffer from Aphasia?";
} else if (questionNum == 3) {
actualQuestion = "Do you suffer from Hemianopia";
} else if (questionNum == 4) {
actualQuestion = "Would you like to setup an account?";
}
utterance.text = actualQuestion;
speechSynthesis.speak(utterance);
}
}
и код выглядит следующим образом
public partial class WebForm1 : System.Web.UI.Page
{
public ApplicationQuestion _Question;
public ApplicationUser _User;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack) // Do all of this on the first time this page lods
{
_User = new ApplicationUser();
_Question = new ApplicationQuestion();
questionLabel.Text = _Question.GenerateQuestion(0);
Session["Question"] = _Question;
Session["User"] = _User;
questionNumber.Value = "0";
SpeechSynthNeeded.Value = "1";
}
else // Do all within this else every time a question is answered
{
_Question = (ApplicationQuestion)Session["Question"];
_User = (ApplicationUser)Session["User"];
if (int.TryParse(questionNumber.Value, out int number))
{
number++;
questionNumber.Value = number.ToString();
}
}
}
protected void Button1_Click(object sender, EventArgs e)
{
if(int.TryParse(questionNumber.Value, out int number))
{
//Generate Next Question
questionLabel.Text = _Question.GenerateQuestion(number);
}
// Add 1 to the questions results list meaning the user answered Yes
_User._QuestionResults.Add(1);
if (int.TryParse(questionNumber.Value, out int number2))
{
// if it is on the first question and they answer yes then set SpeechSynthe Value to 0 so it isnt used in javascript for next question
if (number2 == 1)
{
SpeechSynthNeeded.Value = "0";
}
// if it is on the second question and they answer yes then set SpeechSynthe Value will be set back to 1 so its reactivated
if (number2 == 2)
{
SpeechSynthNeeded.Value = "1";
}
// After Final question redirect to User login page
if (number2 == 5)
{
Response.Redirect("UserLogin.aspx?synthNeeded=" + SpeechSynthNeeded.Value);
}
}
}
При отладке проблемы, которую я получаю сейчас, при первом нажатии кнопки она переходит в pageLoad и переходит в остальное (что что я хочу), но затем вызывается метод нажатия кнопки, и как только он завершается, он возвращается к загрузке страницы и переходит в первую часть If / Else, и поэтому снова устанавливает все переменные, и я теряю данные Мне нужно.
Я не знаю, изменилось ли это что-то крошечное, или я просто сошел с ума от того, что слишком долго смотрю на него, но все, что я пытаюсь сделать, - это установить объект на странице. загрузить, затем при каждом нажатии кнопки я добавляю значение к этому объекту, а затем использую это значение в дальнейшем. Я помещаю этот объект в сеанс, чтобы вернуть его вниз, когда мне это нужно.
Может кто-нибудь сказать мне, почему я снова и снова нажимаю на «Первую» загрузку страницы даже с использованием (! IsPostBack) даже после нажатия кнопки?