【问题标题】:Optional route parameters and action selection可选路由参数和动作选择
【发布时间】:2011-02-15 23:01:57
【问题描述】:

我使用默认路由定义:

{controller}/{action}/{id}

在哪里id = UrlParameter.Optional。据我了解,这意味着当 id 不是 URL 的一部分时,此路由值将不存在于 RouteValues 字典中。

所以这似乎也完全有可能(都是 GET):

public ActionResult Index() { ... } // handle URLs: controller/action

public ActionResult Index(int id) { ... } // handle URLs: controller/action/id

id 缺失时,第一个动作将被执行,但当id 存在时,第二个动作将被执行。很好,但是它不起作用。它无法解析操作。

我怎样才能做到这一点?

我正在考虑编写一个自定义操作方法选择器属性,例如:

[RequiresRouteValue(string valueName)]

这将使使用这种动作方法成为可能。但这是唯一的方法吗?
有内置的东西我可以坚持吗?

【问题讨论】:

    标签: asp.net-mvc-2 action routevalues


    【解决方案1】:

    使用任一:

    [HttpGet]
    public ActionResult Index() { ... } // handle URLs: controller/action
    
    [HttpPost]
    public ActionResult Index(int id) { ... } // handle URLs: controller/action/id
    

    或者只是有一个可以为空的参数:

    public ActionResult Index(int? id) { ... } // handles both instances
    

    编辑: 像这样的东西有用吗?

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

    【讨论】:

    • 恐怕两者都是 GET。我曾想过使用可为空的 int,但我不喜欢多方面的操作,因为它使操作变得比应有的复杂(= 更大的错误表面)。
    • 我仍然给了你一个 +1,因为第二个(使用可为空的 int)是一种可能的解决方法。
    • 拥有两条路线并不能解决问题。您仍然会收到运行时错误。
    【解决方案2】:

    从无法确定动作的例外情况来看,很明显动作首先被解析,然后数据绑定器开始发挥作用并检查动作的参数并尝试将数据绑定到它们。很有道理。

    这很有意义。首先尝试将数据绑定到所有可能的类型并查看我们得到什么然后寻找适当的操作是没有意义的。这几乎是不可能的。

    所以。由于动作选择是这里的问题,我想解决这个问题的最好(也是唯一)方法(如果我不想使用多方面的单一动作方法)是编写一个 自定义动作方法选择器属性 .

    您可以在我的博客上阅读所有详细信息并获取代码:
    Improving Asp.net MVC maintainability and RESTful conformance

    【讨论】:

      猜你喜欢
      • 2015-09-24
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      • 2016-08-22
      • 2012-03-24
      • 2015-02-05
      • 1970-01-01
      相关资源
      最近更新 更多