如何执行高级 ASP.NET MVC (3) 路由(计算操作等)

本文关键字:路由 操作 MVC 计算 ASP 何执行 执行 高级 NET | 更新日期: 2023-09-27 17:56:55

>更新

考虑以下 8 条路由,其中 Administration区域控制器EmployeesController,IdEmployeeId

  1. Administration/Corporate/{controller}/{Id}/Phones/{PhoneId}/Delete
    • 操作 = DeletePhone
  2. Administration/Corporate/{controller}/{Id}/Phones/{PhoneId}/Deactivate
    • 操作 = DeactivatePhone
  3. Administration/Corporate/{controller}/{Id}/Phones/{PhoneId}/Activate
    • 操作 = ActivatePhone
  4. Administration/Corporate/{controller}/{Id}/Notes/{NoteId}/Delete
    • 操作 = DeleteNote
  5. Administration/Corporate/{controller}/{Id}/Files/{FileId}/Delete
    • 操作 = DeleteFile
  6. Administration/Corporate/{controller}/{Id}/Addresses/{AddressId}/Delete
    • 操作 = DeleteAddress
  7. Administration/Corporate/{controller}/{Id}/Addresses/{AddressId}/Deactivate
    • 操作 = DeactivateAddress
  8. Administration/Corporate/{controller}/{Id}/Addresses/{AddressId}/Activate
    • 操作 = ActivateAddress

如何将其转换为:

Administration/Corporate/{controller}/{Id}/{object}/{ObjectId}/{action}对象Phones|Notes|Files|Addresses|?动作Delete|Deactivate|Activate|?的地方?

  1. 我需要获取对象并将其单数化(我已经有了代码)。
    • 对象 = PhonesPhone
  2. 采取行动并将其转换(重写?)为行动+对象(单数化)。
    • 动作 = Delete + PhoneDeletePhone

我可以做所有事情直到第二个 #2,问题是如何将操作转换为路由定义中的其他内容?

这些甚至可能吗?把我现在的 8 条路线变成 1 条会很好。而且这个例子只用我的EmployeesController,我的CustomersController是这个大小的两倍,所以大约 16 条路由可以变成 1 条。这将节省大量空间和代码。

无论如何,如果可能的话,我期待着建议和想法。

如何执行高级 ASP.NET MVC (3) 路由(计算操作等)

您可以创建自定义路由处理程序。

public class CustomRoute : RouteBase
{
    //your custom code
}

ASP.NET MVC 子域路由

我会设置一个简单的数组和方法来处理这种事情。它并不完全优雅,但应该很容易理解:

public static void RegisterRoutes()
{
    var adminRoutes = new[]
                            {
                                new [] { "Phones", "PhoneId", "Delete", "DeletePhone" },
                                // Add the rest of your routes here.
                            };
    foreach ( var adminRoute in adminRoutes )
    {
        RegisterAdminRoute( adminRoute[0], adminRoute[1], adminRoute[2], adminRoute[3] );
    }
}
public static void RegisterAdminRoute( string area, string idName, string actionName, string action )
{
    RouteTable.Routes.MapRoute
        (
            area + actionName,
            String.Format( "Administration/Corporate/{{controller}}/{{Id}}/{0}/{{{1}}}/{2}",
                            area,
                            idName,
                            actionName ),
            new { action }
        );
}