ASP.NET Core 8 Razor 页面将多个页面模型绑定到单个路由

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

我正在使用 ASP.NET Core 8.0.8。我的 razor 页面应用程序有一个动态

Table.cshtml
页面,其路线
@page "/table/{table}"
可以采用任何
model
并在可搜索、可过滤和可排序的表格中显示关联的数据库信息。此
Table.cshtml
页面还根据
model
显示用户可用的关联操作。我有一个
TableModel.cs
类,它处理所有基本
OnGet
OnPost
请求,但某些模型将扩展此类以包含特定的
OnPost
处理程序(
OnPostCreate
OnPostUpdate
OnPostDelete
等)。 .) 或设置不同的
[Authorize(Roles = ...)]
角色。这就是我的问题所在。我只是不知道如何将这些派生的
TableModel
类附加到我的
Table.cshtml
页面,而无需为每个类创建单独/重复的页面。我有很多模型,所以我真的更喜欢将渲染和基本逻辑保留在一页上。

例如:

  • /table/products
    - 每个人都可以访问,使用类
    TableModel.cs
  • /table/items
    - 经过身份验证的用户可以访问,使用类
    ItemsTableModel.cs
  • /table/users
    - 管理员可以访问,使用类
    UsersTableModel.cs

我尝试在

Program.cs
中手动设置页面路由但无济于事。

options.Conventions.AddPageRouteModelConvention("/table/items", model => { new MyApp.Pages.ItemsTableModel(builder.Configuration); });
options.Conventions.AddPageRouteModelConvention("/table/users", model => { new MyApp.Pages.UsersTableModel(builder.Configuration); });

我也尝试过使用部分视图,但在所需的

IConfiguration
方面遇到了麻烦。 我知道将派生类设置为属性也是一种选择,但我不确定这将如何与特定的
OnPost
处理程序一起使用。接受任何建议(如果可能的话)。

c# asp.net-mvc routes razor razor-pages
1个回答
0
投票

以下是我能够实现这一目标的方法:

  1. ASP.NET Core Web App (Razor Pages)
    切换到
    ASP.Net Core Web App (Model-View-Controller)
    ,这使我的解决方案成为可能。

  2. 将默认控制器路由映射保留在我的

    Program.cs
    文件中:

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}"
);
  1. 向我的
    TableController.cs
    添加了一个基本
    Controllers
    类,然后我将使用我的特定表类进行扩展。然后,子类可以根据需要覆盖特定的操作调用。我还有一个
    ModelTable.cs
    类,用于存储与每个表关联的数据:
public class TableController : Controller {
    public ModelTable Model { get; set; } = new ModelTable("");

    [HttpGet]
    public virtual IActionResult Index() {
        return View("~/Views/Table.cshtml", Model);
    }

    [HttpPost]
    public virtual IActionResult Index(string? returnURL) {
        return Redirect(returnURL ?? $"/{Model.TableName}");
    }
}
  1. 这是一个子表类的示例。需要记住的重要一点是,无论您为控制器命名什么(在本例中为
    Users
    ),都将是 URL 路由。所以
    /Users
    会调用这个控制器:
public class UsersController : TableController {
    public UsersController() : base() {
        Model = new UsersTable();
    }

    [HttpGet]
    public override IActionResult Index() {
        // Users-specific database load code here
        return base.Index();
    }
}
    然后,我的
  1. Table.cshtml
     视图将使用提供的和填充的 
    ModelTable.cs
     类在 HTML 表中呈现适当的数据:
@model ModelTable <table id="@Model.TableName"> @foreach (var column in Model.TableColumns) { ... } </table>
*。对于那些可能偶然发现这个问题并询问如何在保持相同 URL 路由的同时路由到不同控制器的人,以下是我如何实现这一目标的。继续这里的 

Users

,我添加了 
UsersFormController.cs
 并更新了我的 
Program.cs
 以包含以下路线映射:

app.MapControllerRoute("usersForm", "/Users/{action}/{id?}", new { controller="UsersForm", action="Index" });
所以现在我可以使用

/Users/Add/{id}

/Users/Edit/{id}
UsersFormController.cs
等。

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