C # ASP.NET AJAX - меняется случайное число, но оно может изменяться только при нажатии кнопки «новый вопрос» - PullRequest
0 голосов
/ 31 октября 2019

Я не хотел слишком усложнять вопрос, но здесь идет ... У меня есть набор вопросов и ответов. Я хочу использовать C # ASP.NET Core MVC, чтобы получить вопрос из файла, отформатировать в формате JSON, вернуть значение вопроса на веб-страницу с помощью AJAX. Вопрос отображается при нажатии кнопки, которая запускает метод C #, путем подключения к нему с помощью оператора Route []. Затем, также в AJAX на той же веб-странице, пользователь может отправить свой ответ. Если они верны, это скажет им. Это работает, если не указан случайный номер. Случайное число просто выбирает строку текстового файла, содержащего вопросы - вот и все! Однако подвох-22 заключается в том, что когда пользователь нажимает кнопку «ОТВЕТ» для отправки своего ответа, он повторно запускает метод C #, который генерирует новое случайное число, поэтому имеет хороший шанс выбрать другую строку изфайл, следовательно, содержит другой ответ, а затем он сообщает пользователю, что он ошибся, даже если они были правильными ... Код на веб-странице:

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script type="text/javascript">

        $(document).ready(function () {  //When document loads, function is ready (this includes ALL of the functions below!)

            $('#showQ').click(function () {
                //Block of code that uses AJAX to DISPLAY questions from Controllers/DemoController.cs/answerQuestion()
                $.ajax(
                    {   //Start of the actual AJAX request code...
                        type: 'GET',    //Use GET method to send values
                        url: '/demo/answerQuestion/',//The location of the method (Controllers/DemoController.cs/answerQuestion)
                        success: function (result) {    //If function is successful, it will display the result
                            $('#displayQ').html(result);  //If the code above is successful, it will display the question inside id="displayQ"
                        }
                    }
                )
            });
            //Block of code that uses AJAX to ANSWER questions from Controllers/DemoController.cs/answerQuestion()
            $('#answerQ').click(function () {   //When answerQ button is clicked, run this function...
                var answer = $('#answer').val();  //var answer = id="answer" field value when answerQ submit button is pressed
                $.ajax(
                    {   //Start of the actual AJAX request code...
                        type: 'GET',    //Use GET method to send values
                        url: '/demo/answerQuestion/' + answer, //Submit answer value to answerQuestion
                        success: function (result) {
                            $('#displayAns').html(result);  //If the code above is successful, it will send the answer and display result in id="displayAns"
                        }
                    }
                )
            });
        }); //End of $(document).ready(function...

    </script>
</head>
<body>

    <fieldset>
        <legend>Question...</legend>
        <br />
        <input type="button" value="Click for question" id="showQ" />
        <br />
        <span id="displayQ"></span>
        <br />
        Answer: <input type="text" id="answer" />
        <br />
        <input type="button" value="Click to submit answer" id="answerQ" />
        <br />
        <span id="displayAns"></span>
        <br />
    </fieldset>

</body>
</html>

Методы C #, которые выбирают значения изAJAX ...

[Route("answerQuestion")]
        [Route("answerQuestion/{answer}")]
        public IActionResult AnswerQuestion(string answer)
        {
            //Need to think of a way to get this to only run when "Next question" button is clicked and not when answer provided!
            //Problem is, if I make it so it only runs if "answer" is not set, then it complains that variable is undefined!
            //It's a bit of a catch-22!!!
            Random rnd = new Random();
            int randomNumber = rnd.Next(0, 10);

            string path = @"C:\Users\aposi\Desktop\csharpweb\HOWMVCWORKS\quizquestions.txt";
            if (System.IO.File.Exists(path))
            {
                string[] allLines = System.IO.File.ReadAllLines(path);
                string randomLine = allLines[randomNumber];
                string removedSlashN = randomLine.Replace("\n", "");
                string removedWhitespace = removedSlashN.Replace(" ", "");
                string[] separatedout = removedWhitespace.Split("|"); //Has to be string array data-type to work with Split() function
                string songname = separatedout[0];
                char songletter = songname[0];
                string artist = separatedout[1];

                if (string.IsNullOrEmpty(answer))
                {
                    return new JsonResult("Artist: " + artist + "First letter of songname: " + songletter);
                }
                else if (answer == songname)
                {
                        return new JsonResult("Well done! You guessed correctly that the song name is: " + songname);
                }
                else if (answer != songname)
                {
                        return new JsonResult("Sorry! You got it wrong! The song name was... " + songname);
                }
                else
                {
                    return new JsonResult("Something went wrong!!!");
                }
            }
            else
            {
                return new JsonResult("No question file found!");
            }
        }
    }
}

1 Ответ

0 голосов
/ 31 октября 2019

Есть несколько способов сделать это.

  1. Разделите это на два вызова:
    • GetQuestion, который возвращает номер строки вопроса с вопросоми
    • AnswerQuestion, который принимает номер строки, и это строка, в которой вы ищете ответ.
  2. Сохраняйте его одним вызовом, когда вы возвращаете строкуномер вопроса с вопросом. Затем вы передаете номер строки обратно с ответом, извлекаете ответ из этого номера строки и сравниваете с их ответом. Затем вы создаете случайное число, чтобы найти новый вопрос.
  3. Сохраните его одним вызовом, но верните ответ с вопросом. Вы просто сохраняете это в своем JavaScript, пока пользователь не ответит. Тогда вам даже не нужно делать новый AJAX-запрос, чтобы узнать, были ли они правы.

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

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

public class Question {
    public string Question { get; set; }

    // if you want to send the answer
    public string Answer { get; set; }

    // if you don't want to send the answer
    public int LineNumber { get; set; }

    // text you show in response to their answer. e.g. "Well done! ..."
    public string ResponseText { get; set; }
}

Затем вы возвращаете этокласс, с установленными свойствами, однако вам нужно в зависимости от того, что произошло. Например, если они ответили правильно, это будет выглядеть примерно так:

return new JsonResult(new Question {
    Question = $"Artist: {artist} First letter of song name: {songletter}",
    Answer = answer, //if you want
    LineNumber = randomNumber,
    ResponseText = $"Well done! You guessed correctly that the song name is: {songname}"
});
...