【问题标题】:ASP.NET MVC Routing: Can I have an action name with a slash in it?ASP.NET MVC 路由:我可以有一个带有斜杠的动作名称吗?
【发布时间】:2010-11-18 21:44:38
【问题描述】:

我想做的是在/Products/Details/{id} 有一个页面,该页面路由到ProductsController 上的操作详细信息以及/Products/Details/Edit/{id} 上的编辑页面。

我尝试在操作上使用[ActionName("Details/Edit")] 来执行此操作,但这不起作用。

【问题讨论】:

  • 为什么不直接称它为EditDetails?
  • 因为这与我要实现的 URL 不匹配。

标签: c# asp.net-mvc url routing


【解决方案1】:

你能做的就是这个。在默认路由之前设置一个这样的新路由;

 routes.MapRoute(
     "PRoute", 
     "{controller}/{action}/{action2}/{id}", 
     null   
 );

然后在您的 Products 控制器中执行这样的操作,注意参数名称与路由中的名称匹配。

public ActionResult Details(string action2, string id)
{
    switch (action2)
    {
        case "edit":
            // Do Something.
            return View("edit");
        case "view":
            // Do Something.
            return View("view");
       default :
            // Do Something.
            return View("bad-action-error");
    }
}

现在,Details 动作将被传递给 action2 和来自 url 的 id。 因此,像 /products/details/view/7 这样的 URL 详细信息操作将获得 "view" 和 "7" ,然后您可以在 action2 上使用 switch 或 if 语句来继续您的处理。现在可以轻松扩展它以包含其他子操作。

【讨论】:

    【解决方案2】:

    像这样BEFORE添加默认路由:

    routes.MapRoute(
        "DefaultWithDetails",
        "{controller}/Details/{action}/{id}"},
        null);
    

    【讨论】:

    • +1 去做 JayArr 要求的事情,尽管我认为 Lewis 的建议在语义上是一个更好的主意。
    • 詹姆斯,是的。我同意。但我只是在回答这个问题:)
    【解决方案3】:

    动作名称中不能有斜线。

    为什么没有下面的动作?

    • /Products/Details/{id} - 用于展示
    • /Products/Edit/{id} - 用于编辑

    我的偏好是执行以下操作:

    • /Products/{id}/View - 用于展示
    • /Products/{id}/Edit/ - 用于编辑

    希望这是有道理的!

    【讨论】:

    • 因为每个产品都有很多浏览量。详细信息、历史记录、文档等,这些页面中的每一个都将在视图和编辑表单中呈现。
    • 不过我喜欢你描述的路由模式。 /Products/{id}/Details 和 /Products/{id}/Details/Edit 完全可以接受。
    • 我会更进一步,只需删除 /Details/ 以查看产品,即 /products/{id} 和编辑可以是 /products/edit/{id}
    猜你喜欢
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    相关资源
    最近更新 更多