我有一个
.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");
}
}
}
我设法通过用以下内容替换原始代码中的表单来使其正常工作:
<form method="post">
<fieldset>
<div>
<label> </label>
<input type="submit" value="Submit" class="submit" />
<input type="hidden" name="session_key" value=@key />
</div>
</fieldset>
如果有人知道为什么这种方法有效而我的第一种方法无效,我将非常感谢您的解释,因为我并没有真正理解这两种方法之间的区别。一般来说,如果有更好的方法通过按钮调用 C# 代码,我也将非常感谢任何和所有提示以供将来参考。
为什么我不能以这种方式使用带有模型的按钮?什么是正确的 按下按钮调用 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>
注意: 请记住,按钮类型为提交,参数应在输入字段中传递。
输出:
注意:我已经尝试过这种方式,它调用了你想要击中的方法。