代码之家  ›  专栏  ›  技术社区  ›  Hooman Bahreini

我可以有一个通用参数名的路由吗

  •  1
  • Hooman Bahreini  · 技术社区  · 6 年前

    我正在ASP上工作。Net MVC路由。我想创建一个将参数传递到操作的路由,而不考虑参数名称。我读了一些关于这方面的书,尝试了不同的选择,但无法让它工作,所以想知道这是否可行吗?

    下面是我的问题和一个例子:

    在我的StudentController中,我有两种动作方法

    // First Action in StudentController
    public ActionResult GetStudentByName(string name)
    
    // Second Action in StudentController
    public ActionResult GetStudentById(int id)
    

    现在,在我的路线配置中,我有:

    // Get Student By Name
    routes.MapRoute(
       name: "StudentByName",
       url: "Student/GetStudentByName/{name}",
       defaults: new { controller = "Student", action = "GetStudentByName", name = "" }
    );
    
    // Get Student By Id
    routes.MapRoute(
        name: "StudentById",
        url: "Student/GetStudentById/{id}",
        defaults: new { controller = "Student", action = "GetStudentById", id = UrlParameter.Optional }
        );
    

    这很好,但我必须为这两个动作定义两条路线。我的操作需要具有不同名称(名称和id)的参数。

    我想要一个通用路由,它处理动作方法并将参数传递给动作,类似这样的?

    // Is this possible?
    routes.MapRoute(
        name: "AspDefault",
        url: "{controller}/{action}/{GenericParamName}",
        defaults: new { controller = "Home", action = "Index", GenericParamName = UrlParameter.Optional }
    );
    

    我试过这个,但没能成功。如果操作中的参数名称与路由不匹配,则它们似乎无法通过。。。

    是否可以用一条路径处理这两种操作方法?如果是,怎么做?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Nkosi    6 年前

    是否可以用一条路径处理这两种操作方法?如果是,怎么做?

    您需要将两个操作上的参数命名为相同的名称,以匹配路由

    例如

    //Student/GetStudentByName/JDoe
    //Student/GetStudentById/13456
    routes.MapRoute(
        name: "StudentDefault",
        url: "Student/{action}/{value}",
        defaults: new { controller = "Student", value = UrlParameter.Optional }
    );
    

    上述路线意味着控制器操作必须更新为

    public class StudentController : Controller {
    
        // First Action in StudentController
        public ActionResult GetStudentByName(string value) {
            //...
        }
    
        // Second Action in StudentController
        public ActionResult GetStudentById(int value) {
            //...
        }
    
    }