【问题标题】:Replace default parameter binding without default route values替换没有默认路由值的默认参数绑定
【发布时间】:2013-09-18 12:39:37
【问题描述】:

我在控制器中有一个动作,例如:

public ActionResult Index(string ssn)
{
}

和默认路由值:{controller}/{action}/{id}

我不想使用像/Home/Index?ssn=1234 这样的网址。我想像/Home/Index/1234 这样使用。 但我也不想为 ssn 参数(或自定义模型绑定器)添加新的路由值。

是否有一些完整的属性,例如[ActionName],但用于参数?

类似这样的:

public ActionResult Index([ParameterBinding("id")] string ssn)
{
}

【问题讨论】:

  • 没有这样的内置属性。为此需要自定义模型绑定器或新的路由条目。
  • 我想知道,你为什么不想添加一条新路线?如果你做得对,它不会与现有的混乱,如果那是你害怕的。
  • '因为我有超过 10 个具有相同签名的操作。我不想为每个操作添加自定义路由(ssn、电子邮件、用户名等)。

标签: asp.net-mvc


【解决方案1】:

正如 Darin 和 Rumi 所提到的 - 没有内置属性,但是您可以通过在单个路由上使用 RouteCollection.MapRoute 约束参数通过单个新路由实现相同的效果(跨多个控制器/动作)。

以下路由配置会将“SSN”路由应用到 Foo 或 Bar 控制器,任何其他控制器都将通过默认路由。

routes.MapRoute(
    name: "SSN",
    url: "{controller}/{action}/{ssn}",
    defaults: new { controller = "Foo", action = "Index" },
    constraints: new { controller = "(Foo|Bar)", action = "Index" }
);
// default route
routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

编辑:或者,您可以使用似乎支持您最初要求的 ActionParameterAlias 库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-08
    • 2020-05-17
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 2012-09-13
    • 2023-02-25
    相关资源
    最近更新 更多