Форма POST ничего не делает - PullRequest
1 голос
/ 14 мая 2019

У меня есть веб-приложение, созданное в ASP.NET Core (последняя версия), в котором необходимо использовать всплывающую форму, в которой необходимо заполнить 1 значение, а затем отправить его обратно в контроллер, чтобы позднее использовать это значение.

Таким образом, процесс выглядит следующим образом: Кнопка> Нажмите на кнопку> Всплывающая форма всплывающего окна (Изображение: всплывающая форма с частичным представлением )> Введите значение> Отправить> Отправитьрезультат возвращается к контроллеру.

Но всякий раз, когда я нажимаю кнопку отправки, он отправляет меня на страницу 400 ошибок не найдена.Что может пойти не так?

Вот код всплывающей формы частичного представления:

@model IEnumerable<ApplicationName.Models.Moederblad>
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, AuthoringTagHelpers
@Html.AntiForgeryToken()

<div id="element_to_pop_up">
    <a class="b-close">x</a>
    //Actionresult > Controller
    @using (Html.BeginForm("Incassodatum", "Moederblads", FormMethod.Post))
    {
        <br />
        <div class="row">
            <div class="col-md-6">
                <label for="Incassodatum">Incassodatum</label>
                <input class="form-control" placeholder="Bijvoorbeeld: 19-02-2020" type="text" data-val="true" data-val-regex="Dat is geen geldige datum" data-val-regex-pattern="^(0[1-9]|[12][0-9]|3[01])[/](0[1-9]|1[012])[/](19|20)[0-9]{2}$, " id="Incassodatum" name="Incassodatum">
            </div>
        </div>
        <div class="row">
        </div>
        <br>
        <input name="__RequestVerificationToken" type="submit" class="btn btn-primary submit" value="Toevoegen" id="submit">
    }
</div>

Вот соответствующий контроллер:

        [HttpGet]
        public ActionResult Incassodatum()
        {
            return View();
        }

        //Automatisch de datum van vandaag in het Incassodatum veld zetten nadat er op een knop is gedrukt
        [HttpPost, ValidateAntiForgeryToken]
        public ActionResult Incassodatum(string Incassodatum)
        {
            string date= "";
            if (ModelState.IsValid)
            {
                date = Incassodatum;
            }
            else
            {
                date = "Something went wrong.";
            }
            TempData["Incassodatum"] = $"{Incassodatum}";
            return RedirectToAction("Index");
        }

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

Я попытался добавить свойство [Route ("Moederblads / Incassodatum")] над постом.Я попробовал это в обычном представлении (поэтому не частичное представление), и там я мог видеть значение с F12.Попытался изменить имена объектов, так как я думал, что они могут конфликтовать с другими именами.

Не знаю, что теперь делать.У кого-нибудь есть догадки?

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

В конце концов было что-то очень простое: мне просто нужно было удалить тег: [HttpPost] над методом и метод [HttpGet], так как в итоге он ничего не делал. После этого он достиг моей точки останова и мог проверить, что значение проходит через штраф:)

0 голосов
/ 14 мая 2019

Но всякий раз, когда я нажимаю кнопку отправки, она отправляет меня на страницу с ошибкой 400.

Ошибка 400 - неверный запрос. А 404 не найден. Таким образом, я не уверен, что вы на самом деле получаете здесь. Однако, исходя из того факта, что у вас есть ввод с __RequestVerificationToken в качестве имени, и вы неправильно его используете, я склоняюсь к 400.

Поскольку вы пытаетесь использовать этот ввод в качестве кнопки, вы установили для него значение, чтобы применить этот текст к кнопке. Однако на самом деле это значение будет опубликовано для __RequestVerificationToken, а не действительный токен. Таким образом, вы всегда будете получать 400 неверных запросов из-за неудачного подтверждения запроса.

Токен подтверждения запроса должен находиться на скрытом вводе, поэтому самое простое решение - удалить имя этой кнопки и добавить скрытый ввод специально для маркера подтверждения запроса: @Html.AntiForgeryToken().

Еще лучше было бы использовать встроенный FormTagHelper, который автоматически обрабатывает токены для защиты от подделки:

<form asp-action="Incassodatum" asp-controller"Moederblads" method="post">
    ...
</form>

Наконец, хотя это технически не оказывает никакого влияния, использование input для кнопок является анти-паттерном, которого следует избегать. Вместо этого используйте <button type="submit">.

...