Как сделать POST из одного обработчика страниц в другой?

Я работаю над проектом ASP.NET Core 2.0, используя Razor Pages (не MVC).

У меня есть следующий поток:

  1. Пользователь заполняет форму и POST
  2. Обработчик POST этой страницы проверяет информацию и возвращает Page(), если есть проблемы. Если нет, обработчик сохраняет данные в базу данных.
  3. Отсюда я хочу, чтобы обработчик POST обработал POST другой страницы с проверенными и сохраненными данными из шага 2.

Как отправить POST на другую страницу из обработчика страниц? Это подходящий способ сделать такую ​​вещь? Причина, по которой я не хочу RedirectToPage(), заключается в том, что я не хочу, чтобы конечная страница в последовательности была перемещаемой через GET. Последняя страница не должна быть доступна по прямой ссылке, а должна возвращаться только на POST.

Я думал о проверке / сохранении данных и установке логического "IsValid" и возвращении страницы, проверке этого IsValid и немедленной публикации на последней странице через JS. Однако это чувствует себя грязным.

1 ответ

Установите свойство "asp-page" формы для другой страницы. Затем установите значения стандартным способом.

<form method="post" asp-page="/pathto/otherpage">
Select Example:<select name="DataForOtherPage">

Затем в вашем контроллере свяжите значение...

 [BindProperty]
 public string DataForOtherPage { get; set; }

Вам не нужно пересекать пост!

Если возможно, вам следует избегать перекрестных сообщений. Сделайте все это в соответствии с оригинальным действием. Действие может вернуть другое представление, указав имя представления в View звоните.

Если цель перекрестной публикации содержит сложную логику, которую вы не хотите дублировать, извлеките ее в общую библиотеку и вызовите ее из обоих действий.

Например, вместо

ActionResult Action1()
{
    if (canHandleItMyself)
    {
        return View("View1");
    }
    else
    {
        return //Something that posts to action2
    }
}

ActionResult Action2()
{
    DoSomethingComplicated1();
    DoSomethingComplicated2();
    DoSomethingComplicated3();
    DoSomethingComplicated4();
    return View("View2");
}

Сделайте что-то вроде этого:

class CommonLibrary
{
    static public void DoSomethingComplicated()
    {
        DoSomethingComplicated1();
        DoSomethingComplicated2();
        DoSomethingComplicated3();
        DoSomethingComplicated4();
    }
}

ActionResult Action1()
{
    if (canHandleItMyself)
    {
        return View("View1");
    }
    else
    {
        CommonLibrary.DoSomethingComplicated();
        return View("View2");
    }
}

ActionResult Action2()
{
    CommonLibrary.DoSomethingComplicated();
    return View("View2");
}

Если вы действительно хотите кросс-пост

Если вы настаиваете на использовании кросс-поста, вам нужно будет отобразить страницу, которая публикует пост, например

<HTML>
<BODY>
    <IMG Src="/Images/Spinner.gif">  <!-- so the user doesn't just see a blank page -->
    <FORM name="MyForm" Action="Action2" Method="Post">
        <INPUT type="hidden" Name="Argument1" Value="Foo">    
        <INPUT type="hidden" Name="Argument2" Value="Bar">
    </FORM>
    <SCRIPT type="text/javascript>
        document.getElementById("MyForm").submit();  //Automatically submit
    </SCRIPT>
</BODY>
</HTML>
Другие вопросы по тегам