PageLoad не работает должным образом в asp. Net Framework - PullRequest
0 голосов
/ 26 марта 2020

Я видел много сообщений на эту тему, но до сих пор не могу понять, почему мой код все еще делает это.

У меня есть 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) даже после нажатия кнопки?

1 Ответ

0 голосов
/ 26 марта 2020

Решено,

Одна из самых странных и раздражающих вещей, которые со мной когда-либо случались.

Удаление строки со страницы aspx остановило загрузку двойной страницы, и теперь она работает как обычно.

Благодаря https://forums.asp.net/t/1004939.aspx?Page_Load+called+twice+ я обнаружил, что кто-то другой решил проблему, поиграв с тегами изображений src = "".

Я добавил это для API распознавания речи и не думал, что это будет происходить, и я до сих пор не знаю, почему это происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...