如何从一个页面处理程序向另一个页面处理程序进行POST请求?

9
我正在使用 Razor Pages (不是 MVC) 开发一个 ASP.NET Core 2.0 项目。
具体的步骤如下:
  1. 用户填写表单并提交。
  2. 该页面的提交处理程序验证信息,如果有问题则返回 Page()。否则,处理程序将数据保存到数据库中。
  3. 从这里开始,我希望处理程序使用来自第2步的验证和已保存的数据提交到另一个页面的提交处理程序。
如何从处理程序内部向另一个页面提交? 这是否是这种代码实现的适当方式? 我不想使用 RedirectToPage() 是因为我不希望最终页面可以通过 GET 请求访问。最终页面不应该通过直接链接访问,只能在 POST 请求时返回。
我考虑验证/保存数据并设置布尔值 "IsValid",然后返回页面,检查 IsValid 并立即通过 JS 提交到最终页面。但是这样做感觉很不好。
2个回答

10
将表单的 "asp-page" 属性设置为另一个页面,然后按照标准方式设置值。
<form method="post" asp-page="/pathto/otherpage">
Select Example:<select name="DataForOtherPage">

然后在你的控制器中,绑定这个值...

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

-4

不需要跨贴!

如果可能的话,应该避免跨贴。在原始操作下完成所有操作。该操作可以通过在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>

1
谢谢回复。我推测除了作为一种解决方法之外,跨贴(cross-posting)还有其他不好的原因吗?另外,我正在使用 Razor Pages 而不是 MVC,所以我不确定我是否可以将您的建议应用到我的项目中。我唯一看到返回另一个视图(Razor Page)的方法是调用 RedirectToPage,但这将指向一个 Get 方法而不是 POST。 - S-Vuk
4
此回答针对MVC操作和视图,不适用于Razor页面处理程序(技术上属于MVVM)。请进行点踩操作。 - McGuireV10
@S-Vuk,跨贴并不一定是坏事,但目前 Razor Pages 没有提供与旧的纯服务器端 Server.Transfer 方法等效的方法 - 您需要引用其他 PageModel。 - McGuireV10
1
如果您有一个页面,用户在其中设置报告设置,并且另一个页面执行实际报告。我认为最好的方法是将第一个页面发布到第二个页面。 - Jonathan Wood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接