Как выполнить POST от одного обработчика страницы к другому?

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

У меня такой поток:

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

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

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


person S-Vuk    schedule 03.01.2018    source источник


Ответы (2)


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

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

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

 [BindProperty]
 public string DataForOtherPage { get; set; }
person pcalkins    schedule 11.02.2019

Перекрестная публикация не требуется!

По возможности следует избегать перекрестной публикации. Делайте все под оригинальным действием. Действие может возвращает другое представление, указав имя представления в 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>
person John Wu    schedule 03.01.2018
comment
Спасибо за ответ. Я полагаю, кросс-постинг - это плохо по какой-то причине, кроме того, что это обходной путь? Кроме того, я использую Razor Pages вместо MVC, поэтому я не использую, если смогу адаптировать то, что вы рекомендуете, к моему проекту. Единственный способ, который я вижу для возврата другого представления (страницы бритвы), - это вызвать RedirectToPage, но это указывает на метод Get вместо POST. - person S-Vuk; 03.01.2018
comment
Голосуйте против, этот ответ предназначен для действий и представлений MVC, а не для обработчиков страниц Razor (технически MVVM). - person McGuireV10; 17.01.2018
comment
@ S-Vuk, перекрестная публикация не обязательно плохая, но на данный момент Razor Pages не предлагает эквивалента старому чисто серверному методу Server.Transfer - вам понадобится ссылка на другую PageModel. - person McGuireV10; 17.01.2018
comment
Если у вас есть одна страница, на которой пользователь устанавливает параметры отчета, и другая страница, на которой выполняется фактический отчет. Я не вижу лучшего подхода, чем разместить первую страницу на второй. - person Jonathan Wood; 18.06.2020