Как сделать POST из одного обработчика страниц в другой?
Я работаю над проектом ASP.NET Core 2.0, используя Razor Pages (не MVC).
У меня есть следующий поток:
- Пользователь заполняет форму и POST
- Обработчик POST этой страницы проверяет информацию и возвращает Page(), если есть проблемы. Если нет, обработчик сохраняет данные в базу данных.
- Отсюда я хочу, чтобы обработчик 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>