为什么带有ASP.NET MVC5路由属性的友好URL每次都不起作用?

时间:2015-12-03 17:40:36

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

我想知道为什么友好的URL是从一个动作而不是另一个动作生成的。

让我告诉你!

    [RoutePrefix("fr-ca/guest")]
    public class GuestController : BaseController
    {        
        [Route("users/{id:int}/{ids:int}")]
        public ActionResult Index(int id, int ids)
        {
            return View();
        }

        [Route("register/{id:int}/{ids:int}")]
        public ActionResult Register(int id, int ids)
        {
            return View();
        }
    }

为了获得友好的URL结果,我使用Razor:

@Html.ActionLink("some text", "Index", "Guest", new { id = 1, ids = 1 }, null)
@Html.ActionLink("some other text", "Register", "Guest", new { id = 1, ids = 1 }, null)

在路线配置文件中,我添加了这一行:routes.MapMvcAttributeRoutes();

所以第一次正常工作,我得到 http:... / fr-ca / guest / users / 1/1 但第二个不起作用!我得到 http:... / fr-ca / guest / register?id = 1& ids = 1

任何人都可以提供帮助吗?

谢谢!

大卫

2 个答案:

答案 0 :(得分:1)

假设您没有任何与此相冲突的其他路线定义,

@Html.ActionLink("some other text", "Register", "Guest", new { id = 1, ids = 1 }, null)会生成href值为http://yoursitename/fr-ca/guest/register/1/1的锚标记,而不是http:.../fr-ca/guest/register?id=1&ids=1

由于您已将模式指定为register/{id:int}/{ids:int}它应该适用于register/1/1网址,但不适用于/register?id=1&ids=2。这是预期的行为。

答案 1 :(得分:0)

您可以使用Html.ActionLink而不是Html.RouteLink。此帮助程序具有重载,该重载采用要使用的路由的名称。您必须在路线中添加名称:

在您的控制器中:

[Route("register/{id:int}/{ids:int}", Name="GuestRegister")]
public ActionResult Register(int id, int ids)
{
    return View();        
}

在您看来:

@Html.RouteLink("some other text", "GuestRegister", new { id = 1, ids = 1 }, null)

这导致:

http://.../fr-ca/guest/register/1/1