我正在使用 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
处理程序一起使用。接受任何建议(如果可能的话)。
以下是我能够实现这一目标的方法:
从
ASP.NET Core Web App (Razor Pages)
切换到ASP.Net Core Web App (Model-View-Controller)
,这使我的解决方案成为可能。
将默认控制器路由映射保留在我的
Program.cs
文件中:
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}"
);
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}");
}
}
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();
}
}
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
等。