Страница Razor - ошибка 400 при использовании тега «action» для перенаправления на URL при нажатии на кнопку, завернутую в форму - PullRequest
2 голосов
/ 24 февраля 2020

У меня есть свойство Url на моей странице Модель, которую я настроил как [BindProperty]. Это свойство содержит URL, который я хочу перенаправить, когда пользователь нажимает кнопку Back. Однако, когда я нажимаю кнопку «Назад», я получаю сообщение об ошибке 400, хотя я вижу, что строка URL была правильно добавлена ​​в URL.

Если я затем просто обновлю sh страницу, нужную мне страницу перенаправить на загрузку, как ожидалось.

Почему я получаю ошибку 400? и как я могу предотвратить это?

cs html страница:

@page "{id:int}"
@model CalculationMonitor.CalculationVariablesModel
@{
    ViewData["Title"] = "CalculationVariables";
}
<br />
<h2 style="text-align:center">Calculation Variables</h2>
<br/>
<table style="margin-left:auto; margin-right:auto; cursor:default; width:50%;" class="table-bordered center">
    @foreach (var dict in Model.CalculationVariablesDict)
    {
        <tr style="cursor:default;">
            <th style="color:white;">@dict.Key</th>
            <td style="color:black;">@dict.Value</td>
        </tr>
    }
</table>
<br/>
<form action="@Model.Url" method="POST">
    <body style="text-align:center">
        <button type="submit" style="color:black;" class="btn-sm ml-auto mr-1" title="Back">
            Back
        </button>
    </body>
</form>

cs html .cs страница:

namespace CalculationMonitor
{
    public class CalculationVariablesModel : PageModel
    {
       [BindProperty]
        public string Url { get; set; }
    }

public void OnGet(int id, string db, string server, string url)
        {
           Url = url;
        }

Ответы [ 2 ]

2 голосов
/ 24 февраля 2020

Ваша форма использует глагол http POST, но вы пытаетесь выполнить команду, используя глагол GET. Он не может перенаправить сообщение формы таким способом. Вы не соответствуете.

Ключевые моменты, на которые следует обратить внимание:

form action = "@ Model.Url" method = " POST "

publi c void OnGet

Либо измените метод формы, чтобы использовать вместо него Get, либо реализуйте метод OnPost () вместо OnGet

1 голос
/ 25 февраля 2020

Кроме того, Razor Pages автоматически защищены от XSRF / CSRF, если вы хотите использовать метод POST, вам также необходимо указать AntiForgeryToken, см.

https://docs.microsoft.com/en-us/aspnet/core/security/anti-request-forgery?view=aspnetcore-3.1

Итак, решение состоит в том, что вам нужно реализовать обработчик OnPost для URL и добавить @Html.AntiForgeryToken() в вашу форму.

CalculationVariablesModel.cs html

<form action="@Model.Url" method="Post">
    @Html.AntiForgeryToken() 
</form>

PageModel:

public IActionResult OnPost()
{
    //...
    return Page();
}
...