Asp.Net MVC路由 - 处理具有相同签名的多个路由?

Lia*_*amB 3 asp.net-mvc routes

我很想知道人们如何处理以下情况.

假设我们有一个DataField,每个DataField可以有无限数量的DataValues

我们有2个控制器来处理这些对象的操作

  • DataFieldController
  • DataValueContoller

现在,如果我们需要添加新的DataValue,我们需要知道CustomDataField的ID.将使用以下URL,

/CustomDataValue/Add/1 
Run Code Online (Sandbox Code Playgroud)

1 = DataField ID

但是,因为ASp.Net MVC引擎将参数名称绑定到模型(在下面的情况下为IE.当我实际尝试通过FieldID时,我的DatValeu对象将替换其ID)

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Site", action = "Home", id = UrlParameter.Optional } // Parameter defaults
    );
Run Code Online (Sandbox Code Playgroud)

我们怎么办呢?显然,执行以下操作无效.

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Site", action = "Home", id = UrlParameter.Optional } // Parameter defaults
);

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{fieldid}", // URL with parameters
    new { controller = "Site", action = "Home", fieldid = UrlParameter.Optional } // Parameter defaults
);
Run Code Online (Sandbox Code Playgroud)

我认为这是一个常见的问题,我暂时找不到明显的解决方案.如果签名是不同的,但两者都是/ String/String/Int,那就没问题

==========================

那些路线怎么能起作用呢?

  • / DataValue /添加/ {} DataFieldID
  • / DataValue /编辑/ {ID}
  • / DataValue /列表/ {DataFieldID}

我必须添加3条路线吗?

Ufu*_*arı 5

在这样的路线中使用约束:

routes.MapRoute(
    "Default", // Route name
    "CustomDataValue/{action}/{fieldid}", // URL with parameters
    new { controller = "Site", action = "Home", fieldid = UrlParameter.Optional } // Parameter defaults
);
Run Code Online (Sandbox Code Playgroud)

它确保只有以"CustomDataValue"开头的URL才会调用此路由.它被声明为常量,与默认路由不同.确保在默认路由之前声明这些指定的路由.由于没有限制,所有URL都与之匹配.

更新

我想你必须使用http://domain.com/CustomDataValue/Add/23这样的URL调用DataValueController方法.如果是这种情况,请使用以下路线:

routes.MapRoute(
    "CustomData", // Route name
    "CustomDataValue/{action}/{fieldid}", // URL with parameters
    new { controller = "DataValue", action = "List", fieldid = UrlParameter.Optional } // Parameter defaults
);
Run Code Online (Sandbox Code Playgroud)

如果在名为List/Add/Edit的DataValueController中有操作方法,则此方法有效.