基于动作的重定向 ASP.Net Core Razor

Posted

技术标签:

【中文标题】基于动作的重定向 ASP.Net Core Razor【英文标题】:Action based redirect ASP.Net Core Razor 【发布时间】:2020-09-27 15:34:15 【问题描述】:

我所在的地方简介: 在我的第 1 页程序中,他们选择一台打印机并单击一个按钮,该按钮提交服务调用并加载下一页机器信息。重定向操作调用以下方法:

public async Task<IActionResult> OnGetSelectThisPrinter(int? printerID)
    
        var printerServiceCall = new Service_Calls
        
            PrinterID = (int)printerID,
            Time = DateTime.Now,
            Date = DateTime.Now               
        ;
        _context.Service_Calls.Add(printerServiceCall);
        await _context.SaveChangesAsync();
        var ServiceCalls = from m in _context.Service_Calls
                           select m;
        Service_Calls ServiceCall = ServiceCalls.Last();            
        return RedirectToPage("MachineInformaion?id=" + ServiceCall.ID);
        //return RedirectToPage("./Index");
    

在此代码中,printerID = 1 是一个占位符,直到我弄清楚如何传递特定机器的详细信息(任何有关传递的帮助都会有所帮助)。 此页面的 html 以及按钮如下:

    <table class="table">
    <thead>
        <tr>
            <th>

                @Html.DisplayNameFor(model => model.Printer[0].MachineID)
            </th>
            <th>
                <a asp-page="./SelectPrinter" asp-route-sortOrder="@Model.LogSortParam">@Html.DisplayNameFor(model => model.Printer[0].Log_ID)</a>
            </th>
            <th>
                <a asp-page="./SelectPrinter" asp-route-sortOrder="@Model.LeaseSortParam">@Html.DisplayNameFor(model => model.Printer[0].Lease_ID)</a>
            </th>
            <th>
                <a asp-page="./SelectPrinter" asp-route-sortOrder="@Model.SerialSortParam">@Html.DisplayNameFor(model => model.Printer[0].Serial_Number)</a>
            </th>
            <th>
                <a asp-page="./SelectPrinter" asp-route-sortOrder="@Model.SolutionSortParam">@Html.DisplayNameFor(model => model.Printer[0].Solution)</a>
            </th>
            <th>
                <a asp-page="./SelectPrinter" asp-route-sortOrder="@Model.AdditionalSortParam">@Html.DisplayNameFor(model => model.Printer[0].Additional_Info)</a>
            </th>
            <th>
                <a asp-page="./SelectPrinter" asp-route-sortOrder="@Model.InstallationSortParam">@Html.DisplayNameFor(model => model.Printer[0].InstallationDate)</a>
            </th>
            <th>
                <a asp-page="./SelectPrinter" asp-route-sortOrder="@Model.MonoClickSortParam">@Html.DisplayNameFor(model => model.Printer[0].Mono_Click)</a>
            </th>
            <th>
                <a asp-page="./SelectPrinter" asp-route-sortOrder="@Model.ColourCLickSortParam">@Html.DisplayNameFor(model => model.Printer[0].Colour_Click)</a>
            </th>
            <th>
                <a asp-page="./SelectPrinter" asp-route-sortOrder="@Model.MinimumSortParam">@Html.DisplayNameFor(model => model.Printer[0].Minimum)</a>
            </th>
            <th>
                <a asp-page="./SelectPrinter" asp-route-sortOrder="@Model.PartsSortParam">@Html.DisplayNameFor(model => model.Printer[0].Parts_Warranty)</a>
            </th>
            <th>
                <a asp-page="./SelectPrinter" asp-route-sortOrder="@Model.ITSortParam">@Html.DisplayNameFor(model => model.Printer[0].IT_Support)</a>
            </th>
            <th>
                <a asp-page="./SelectPrinter" asp-route-sortOrder="@Model.ContractSortParam">@Html.DisplayNameFor(model => model.Printer[0].Contract_Type)</a>
            </th>
            <th>Select Printer</th>
        </tr>
    </thead>
    <tbody>

@foreach (var item in Model.Printer) 
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.MachineID)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Log_ID)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Lease_ID)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Serial_Number)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Solution)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Additional_Info)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.InstallationDate)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Mono_Click)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Colour_Click)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Minimum)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Parts_Warranty)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.IT_Support)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Contract_Type)
            </td>
            <td>
                <form method="get" asp-page-handler="OnGetSelectThisPrinter" asp-route-id="@item.MachineID">
                    <button value="Select Printer" />
                </form>
            </td>
        </tr>

    </tbody>
</table>

但是,此时按钮不执行任何操作。看起来他们没有进入 OnGetSelectThisPrinter 方法。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

我建议你可以使用&lt;a&gt;标签来访问处理程序,因为你只需要传递一个参数。

<a asp-page="/Printer" asp-page-handler="SelectThisPrinter" asp-route-printerID="@item.MachineID">SelectThisPrinter</a>

打印机页面中的处理程序:

public IActionResult OnGetSelectThisPrinter(int printerID)

    ...

【讨论】:

这非常有效,谢谢。它按预期重定向。【参考方案2】:

首先,本教程对我即将给出的答案进行了更深入的讨论。看看吧:https://www.learnrazorpages.com/razor-pages/handler-methods

你好!让我们从使按钮工作开始。为了将用户重定向到页面的特定操作,我们可以使用asp-page-handler 属性来指定处理请求的方法。此外,我们使用asp-route-id 属性来描述我们选择的打印机。最后,我们将这一切都包装在一个表格中。所以,我们替换

<input type="button" onclick="SelectThisPrinter()" value="Select Printer" />

<form method="get" asp-page-handler="selectThisPrinter" asp-route-id="@item.MachineID">
  <button value="Select Printer" />
</form>

然后,在您的代码隐藏中,我们可以对您的处理程序进行一些简单的更改。我们改变

public async Task<IActionResult> SelectThisPrinter()

  int printerID = 1;
  ...

public async Task<IActionResult> OnGetSelectThisPrinter(int? printerId)

  ...

我希望这会有所帮助。如果您有任何其他问题,请告诉我。

【讨论】:

以上是关于基于动作的重定向 ASP.Net Core Razor的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core MVC RedirectToAction 不工作

ASP.NET 网页的重定向和传值

拦截asp.net core Authorize action,授权成功后执行自定义动作

如何在 ASP.NET CORE 中使用具有依赖注入的动作过滤器?

ASP.NET Core 动作结果 - ASP.NET Core 基础教程 - 简单教程,简单编程

ASP.NET MVC 3 - 重定向到另一个动作