0

有没有办法在不改变动作或调用的控制器的情况下更改 mvc 中给定动作的 URL?

如果是这样,如何在以下 MapRoute 上完成:

routes.MapRoute(
            "Estate.CloseDeal",
            "Estate/CloseDeal/{groupId}/{paymentType}/{mortgageValue}/{province}",
            new { controller = "Estate", action = "CloseDeal" },
            new { groupId = "\\d+", paymentType = "\\d+", mortgageValue = "\\d+", province = "\\d+" }
        );

所需的 URL 是:“.../estate-support/deal-closing/...”。目前它显示为“.../Estate/CloseDeal/...”

链接到此操作的按钮如下所示:

 <button detail="@Url.Action("CloseDeal", new { groupId = info.GroupId })" class="orange">

编辑1:

尝试更改为:

routes.MapRoute(
        "Estate.CloseDeal",
        "estate-support/deal-closing/{groupId}/{paymentType}/{mortgageValue}/{province}",
        new { controller = "Estate", action = "CloseDeal" },
        new { groupId = "\\d+", paymentType = "\\d+", mortgageValue = "\\d+", province = "\\d+" }
    );

此返回错误:您要查找的资源已被删除、名称已更改或暂时不可用。

编辑2:

更改第二个字符串适用于除此之外的所有路由 - 不同之处在于,此路由具有附加参数(groupID、paymentType 等)。

4

3 回答 3

3

只需"Estate/CloseDeal"用 - 替换第二个字符串"estate-support/deal-closing"即可。

在这种特殊情况下,这很容易,因为路由没有通过控制器和操作名称参数化 - 即路由中没有"{controller}/{action}"

于 2012-05-29T16:44:00.010 回答
1

您还可以使用RouteAttribute将路由直接应用于操作(如下所示)或控制器类本身

// Your controller class
// (You could add a Route attribute here)]
public class Estate
{
    // Directly apply a route (or 2?!) to this action
    [Route("estate-support/deal-closing")]
    [Route("clinched")] // You can add multiple routes if required
    public ActionResult CloseDeal()
    {
        ...
    }

    // And of course you can parameters to the route too, such as:
    [Route("customers/{customerId}/orders/{orderId}")]
    public ActionResult GetOrderByCustomer(int customerId, int orderId)
    {
        ...
    }

    ...
}

为此,您需要通过调用MapMvcAttributeRoutes来启用它RouteConfig.cs

public static void RegisterRoutes(RouteCollection routes)
{
    // Enable mapping by attibute in the controller classes
    routes.MapMvcAttributeRoutes();
    ...
}

来自 docs.microsoft.com 的更多信息:ASP.NET 中的属性路由
和此处:C# Corner - MVC 中的路由属性

于 2018-02-07T14:30:48.597 回答
0

您需要更新Url.Action调用的参数或让您路由您想要呈现以匹配 Url.Action 调用的参数(即,如果使用使用名称的 Url>Action 覆盖,名称应该匹配)。

请注意,如果您希望人们可以将旧 URL 添加到收藏夹中,您可能希望通过添加路由将简单地重定向到新 URL 将旧 URL 映射到新 URL。

于 2012-05-29T17:24:05.933 回答