ASP.NET Core MVC 通过razor页面按钮调用函数

问题描述 投票:0回答:2

我有一个

.cshtml
页面,显示有关赛车比赛的一些信息。在底部,我想添加一个按钮,该按钮调用一个函数,将该会话的驱动程序获取到数据库,并将我重定向到在列表中显示它们的页面。

我的代码如下:

@page
@model WebApplication1.Pages.Sessions.DetailsModel

@{
    ViewData["Title"] = "Details";

    @functions {
        PlatformyProgramistyczneAPI.DbManager dbman = new PlatformyProgramistyczneAPI.DbManager();
        public void OnPost()
        {
            dbman.ReplaceDriversDbBySession(Model.SessionDb.session_key);
            Response.Redirect("/Drivers");
        }
    }
}

<h1>@Html.DisplayFor(model => model.SessionDb.country_name)</h1>

<div>
    <h4>@Html.DisplayFor(model => model.SessionDb.circuit_short_name) @Html.DisplayFor(model => model.SessionDb.year)</h4>
    <hr />
    <dl class="row">
        <dt class="col-sm-2">
            Start date
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.SessionDb.date_start)
        </dd>
        <dt class="col-sm-2">
            End date
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.SessionDb.date_end)
        </dd>
    </dl>
</div>

<form asp-page-handler="post">
    <button onclick="" class="btn btn-default">Show drivers</button>
</form>

我在底部创建了一个仅包含提交按钮的表单,希望我可以调用

OnPost()
功能,但是当我单击它时,与模型相关的所有数据都从页面中消失,并且
OnPost
中没有任何操作执行。当我注释掉与模型相关的每一行时,它会按预期工作。

为什么我不能以这种方式使用带有模型的按钮?按按钮调用 C# 的正确方法是什么?

这是我的

DetailsModel
代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore;
using PlatformyProgramistyczneAPI.F1Api;

namespace WebApplication1.Pages.Sessions
{
    public class DetailsModel : PageModel
    {
        private readonly PlatformyProgramistyczneAPI.F1Api.DriversDatabase _context;

        public DetailsModel(PlatformyProgramistyczneAPI.F1Api.DriversDatabase context)
        {
            _context = context;
        }

        public SessionDb SessionDb { get; set; } = default!;

        public async Task<IActionResult> OnGetAsync(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }

            var sessiondb = await _context.Sessions.FirstOrDefaultAsync(m => m.id == id);
            if (sessiondb == null)
            {
                return NotFound();
            }
            else
            {
                SessionDb = sessiondb;
            }
            return Page();
        }
        
        public IActionResult OnPost(int session_key)
        {
            PlatformyProgramistyczneAPI.DbManager dbman = new PlatformyProgramistyczneAPI.DbManager();
            dbman.ReplaceDriversDbBySession(session_key);
            return Redirect("/Drivers");
        }
    }
}
c# asp.net-core razor asp.net-core-mvc
2个回答
0
投票

我设法通过用以下内容替换原始代码中的表单来使其正常工作:

<form method="post">
<fieldset>
    <div>
        <label>&nbsp;</label>
        <input type="submit" value="Submit" class="submit" />
        <input type="hidden" name="session_key" value=@key />
    </div>
</fieldset>

如果有人知道为什么这种方法有效而我的第一种方法无效,我将非常感谢您的解释,因为我并没有真正理解这两种方法之间的区别。一般来说,如果有更好的方法通过按钮调用 C# 代码,我也将非常感谢任何和所有提示以供将来参考。


0
投票

为什么我不能以这种方式使用带有模型的按钮?什么是正确的 按下按钮调用 C# 的方法?

如果您想通过单击 cshtml 按钮来调用

IActionResult OnPost(int session_key)
方法,您只需要一个已经拥有的
asp-page-handler
即可。我不确定你所说的调用 C# 是什么意思。

根据您的场景,如果您想调用

Details.cshtml.cs
post 方法,您可以简单地按如下方式调用它,并可以使用输入字段传递参数。我已尝试如下,
OnPost(int session_key)
已相应调用。

我已经修改了您的代码以进行测试:

详情.cshtml.cs

public class DetailsModel : PageModel
{
    public string SessionKey { get; set; } = "This is my default key";
    public void OnGet()
    {
    }

    public IActionResult OnPost(string session_key)
    {
        var submittedKey = session_key;
        //PlatformyProgramistyczneAPI.DbManager dbman = new PlatformyProgramistyczneAPI.DbManager();
        //dbman.ReplaceDriversDbBySession(session_key);
        return Redirect("/Drivers");

    }
}

详细信息.cshtml:

@page
@model RazorPageApp.Pages.DetailsModel

<form method="post" asp-page-handler="OnPost">
    <input type="hidden" name="session_key" value="@Model.SessionKey" />
    <button type="submit" class="btn btn-primary">Show drivers</button>
</form>

注意: 请记住,按钮类型为提交,参数应在输入字段中传递。

输出:

注意:我已经尝试过这种方式,它调用了你想要击中的方法。

© www.soinside.com 2019 - 2024. All rights reserved.