【问题标题】:Razor Page with two submit buttons and return to the same page带有两个提交按钮并返回同一页面的 Razor 页面
【发布时间】:2020-12-26 16:23:54
【问题描述】:

我在一个使用 Razor Pages 的 Asp.Net Core 项目中遇到了一个奇怪的情况。
简单地说,我有一个带有两个提交按钮的表单。其中一个用于保存表单并返回主页,第二个用于保存表单然后重新初始化模型 BindedProperty 以再次插入另一个文档(保存并重复场景)。

第一个提交按钮没有定义页面处理程序,按照惯例应该调用 PageModel 文件上预定义的 OnPostAsync 方法,第二个提交按钮有一个 asp-page-handler="SaveAndRepeat" 并且应该调用一个名为 @ 的自定义页面处理程序方法987654323@.

这是没有所有 div 和输入的 cshtml 代码。

<form method="POST">
    ... a lot of html and tags ...
    <button id="insert-doc-button" type="submit" class="btn btn-primary">Save</button>
    <button id="insert-repeat-doc-button" type="submit" asp-page-handler="SaveAndRepeat" class="btn btn-primary">Save and Repeat</button>            }
</form>

这是 PageModel 文件中响应提交的精简代码

    [BindedProperty]
    DocumentVM CurrentDoc {get;set;}
    .....
    
    public async Task<IActionResult> OnPostAsync()
    {
        try
        {
            bool saved = await CommonSave();
            ......
            return RedirectToPage("/index");
        }
        ....
    }
    public async Task<IActionResult> OnPostSaveAndRepeatAsync()
    {
        try
        {
            bool saved = await CommonSave();
            ...
            // Duplicates the BindedProperty
            CurrentDoc = CurrentDoc.Duplicate();
            return Page();
        }
        ....
    }

现在的问题。如您所见,在调用 SaveAndRepeat 之后,PageModel 代码返回到同一页面,其中 BindedProperty 加载了上次保存时重复的值。 (它按预期工作) 但是现在,如果我尝试按下保存按钮(因为我已经到达要插入的最后一个文档),代码将再次调用OnPostSaveAndRepeatAsync 处理程序,而不是默认的OnPostAsync。 当然,如果我只按下保存按钮,这不会发生,因为我只有一个文档要插入。在这种情况下,代码正确调用了OnPostAsync

说实话,我不是这项技术的专家,现在才开始我的第一个项目,但这似乎我还没有理解一些重要的东西。是的,我已经解决了为保存按钮设置 asp-page-handler 的问题,但是我真的很想知道这种行为的原因。

我还需要补充一点,该项目使用 ASP.NET Core 3.0,因为 ISP 施加的限制尚未在其托管服务器上启用 3.1 版本。

【问题讨论】:

    标签: c# asp.net-core razor-pages


    【解决方案1】:

    如果您首先单击OnPost 方法,它会起作用,因为您的路线上没有任何处理程序。

    每当您使用asp-page-handler 时,处理程序的名称都会作为查询字符串参数添加到您的路由中,您可以在浏览器上查看。

    之后,您将调用默认 OnPost,它不需要任何处理程序参数并且不会修改它们,这使得 Razor Pages 认为您正在使用SaveAndRepeat 处理程序,因此它被重定向到您的 OnPostSaveAndRepeatAsync 方法。

    单击具有不同asp-page-handler 的按钮会更改查询字符串上的处理程序参数,使其调用指定的方法。

    【讨论】:

    • 嗯,确实可能是这样。你知道是否有办法删除这个添加的处理程序以将路由重置为其初始状态? (这并不是说它真的很重要,因为为保存按钮添加一个特定的处理程序似乎比现在重置任何东西更好)
    • 我认为有些帖子可以回答这个问题。您可以查看thisthis。虽然我认为正确的方法是添加asp-page-handler 标签。
    • 编辑:这些链接仅适用于.net。 Razor Pages 使用这些标签在 Pages 和 PageModels 之间传输信息,因此不建议删除它们。如果您仍然想这样做,可以查看naspinski solution。希望对您有所帮助。
    猜你喜欢
    • 2020-10-05
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 2023-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多