复选框单击 Razor 页面 AspNetCore 2.2 中的表单提交

Posted

技术标签:

【中文标题】复选框单击 Razor 页面 AspNetCore 2.2 中的表单提交【英文标题】:Checkbox Click Form Submit in Razor Pages AspNetCore 2.2 【发布时间】:2020-01-17 12:27:55 【问题描述】:

我正在尝试(非 Ajax)获取一个复选框以在 Razor 页面中重新提交表单并重新加载页面 / 并在我的 OnPost 方法中捕获结果。

我的 index.cshtml 中有

@page  "id:int?"
@model IndexModel

<div class="text-center">
    <form action="post" name="form1">
        <strong>Filter:</strong> Hide Single Runs <input onclick="document.form1.submit()" asp-for="@Model.HideSingle" />        
        <hr />

在我的 PageModel 中

public class IndexModel : PageModel

    public bool HideSingle  get; set;  = true;

    public async Task OnPost(int? id, bool hideSingle)
    

说一个起始页的 URL:

http://localhost:5000/TestRuns/1

表单在复选框单击时提交,但它以一个 Url 结尾:

http://localhost:5000/TestRuns/post?HideSingle=false

这显然无法解决,因为我期待http://localhost:5000/TestRuns/1 的路线。

【问题讨论】:

【参考方案1】:

对于 Asp.net Core 表单,默认方法是 Get,这意味着对于您当前的代码,它使用 Get 而不是 post 发送请求。您可以使用post 指定方法,例如

<div class="text-center">
    <form method="post" name="form1">
        <strong>Filter:</strong> Hide Single Runs <input onclick="document.form1.submit()" asp-for="@Model.HideSingle" />
        <hr />
    </form>
</div>

对于另一种方式,您可以明确设置处理程序,如

<div class="text-center">
    <form asp-page-handler="post" name="form2">
        <strong>Filter:</strong> Hide Single Runs <input onclick="document.form2.submit()" asp-for="@Model.HideSingle" />
        <hr />
    </form>
</div>

【讨论】:

【参考方案2】:
<input onclick="document.form1.submit()" />

正在使用 javascript 提交表单。由于您没有使用 Ajax(根据您的问题),您是否希望该页面回发?

您希望页面上的呼叫最终成为http://localhost:5000/TestRuns/post?id=1&amp;HideSingle=false。您的帖子是否需要 id 才能正常工作(OnPost(int? id..) 不清楚?

我为了得到这两个值,你需要有hidden form values 或多个&lt;input asp-for="Email" class="form-control" /&gt;。 hideSingle 需要 1,id 需要 on。

【讨论】:

以上是关于复选框单击 Razor 页面 AspNetCore 2.2 中的表单提交的主要内容,如果未能解决你的问题,请参考以下文章

命名空间“Microsoft.AspNetCore.Razor”中不存在类型或命名空间名称“Hosting”

尝试根据 Razor 页面上的复选框值更改 <td> 背景颜色

asp.net core razor 页面复选框模型绑定(始终为 false)

在 Razor 页面中使用 DateTime 参数

如何在 Razor 页面中使用 MVC 部分视图和布局

使用 ASP NET Core 2.0 Razor 页面进行路由