1

我正在尝试使我的 url seo 友好。我需要用这种结构制作网址

www.domainname.com/article123。

有了这条路线

routes.MapRoute(
        "articlename", // Route name
        "aaaa/{articleID}", // URL with parameters
         new {action="DetailsByName",controller="Article"},
        new string[] { "bssnew.Controllers" } // Parameter defaults);

它不起作用。我的路线链接看起来像这样

 @Html.RouteLink("aaa ","articlename", new {articleID="CentralPark",},new { @class = "item-link" })

但是当我在路由中添加控制器和动作时它可以工作

 routes.MapRoute(
        "articlename", // Route name
        "aaaa/{controller}/{action}/{articleID}", // URL with parameters
         new {action="DetailsByName",controller="Article"},
        new string[] { "bssnew.Controllers" } // Parameter defaults);
4

5 回答 5

2

如果您只需要一个 ID 特定路线,以下应该可以工作

routes.MapRoute(
    "articlename", // Route name
    "{articleID}", // URL with parameters
    new { action="DetailsByName",controller="Article" }, // parameter defaults 
    new[] { "bssnew.Controllers" } // controller namespaces
);

假设您有一个看起来像的控制器

namespace bssnew.Controllers
{
    public class Article : Controller
    {
        public ActionResult DetailsByName(string articleID)
        {
            ...
        }
    }
}
于 2013-06-30T09:39:54.210 回答
1

我是通过詹姆斯的评论回复你的。一个问题可能是您的路线如下所示:

routes.MapRoute(
    "articlename", // Route name
    "{articleID}", // URL with parameters
    new { action="DetailsByName",controller="Article" }, // parameter defaults 
    new[] { "bssnew.Controllers" } // controller namespaces
);

生成路由(不使用命名路由)时,您的链接应如下所示:http://www.example.com/Article/DetailsByName?articleId=123其中 123 是您的文章 ID。

像这样生成上述链接的条件是将其放在“默认”路由之前。另外,检查命名空间注册是否给您带来了问题。如果不需要,请先尝试删除命名空间。

这是我根据您的问题创建的快速示例。结果是,即使将命名路由置于默认路由之下,我也设法生成了正确的路由。以下是 的内容RouteConfig.cs

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

        routes.MapRoute(
            name: "CalculationRoute", // Note that it is below the default route
            url: "{controller}/{action}/{x}/{y}", // using both controller and action
            defaults: new { controller = "Home", action = "Calculate"}
        );
    }
}

在我的 HomeController 中,我添加了以下操作:

public ActionResult Calculate(int x, int y)
{
    return Content(String.Format("x:{0} + y:{1} = {2}", x, y, (x + y)));
}

现在,这里是索引视图的内容

<table>
    <thead>
        <tr>
            <th>Method used</th>
            <th>Result</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>@@Html.ActionLink("Sample link", "Calculate", "Home", new {x = 1, y = 2})</td>
            <td>@Html.ActionLink("Sample link", "Calculate", "Home", new {x = 1, y = 2})</td>
        </tr>
        <tr>
            <td>@@Html.RouteLink("Sample link", new {controller = "Home", action = "Calculate", x = 1, y = 2}, null)</td>
            <td>@Html.RouteLink("Sample link", new {controller = "Home", action = "Calculate", x = 1, y = 2}, null)</td>
        </tr>
        <tr>
            <td>@@Html.RouteLink("Sample link", "CalculationRoute", new {controller = "Home", action = "Calculate", x = 1, y = 2})</td>
            <td>@Html.RouteLink("Sample link", "CalculationRoute", new {controller = "Home", action = "Calculate", x = 1, y = 2})</td>
        </tr>
        <tr>
            <td>@@Url.RouteUrl(new {controller = "Home", action = "Calculate", x = 1, y = 2})</td>
            <td>@Url.RouteUrl(new {controller = "Home", action = "Calculate", x = 1, y = 2})</td>
        </tr>
        <tr>
            <td>@@Url.RouteUrl("CalculationRoute", new {controller = "Home", action = "Calculate", x = 1, y = 2})</td>
            <td>@Url.RouteUrl("CalculationRoute", new {controller = "Home", action = "Calculate", x = 1, y = 2})</td>
        </tr>
    </tbody>
</table>

上面的代码生成了预期的内容。例如(顺便说一句,我正在使用一些虚拟链接,因为 SO 不允许使用 localhost):

如果我从计算路由中删除 {controller}/{action} ,它将生成链接(带有命名路由)为http://www.example.com/1/2

总而言之,如果您打算使用命名路由来生成对 SEO 友好的 URL,请使用 {controller}/{action}/{articleId} 配置您的路由。如果它不是太重要,则使用 RouteLink 生成您的路线,但不要指定路线名称。

更新:如果你不打算在你的路由中使用 {controller}/{action} 并且只使用 {articleId},你应该将你的路由放在 Default 之前,并且在生成链接时不要使用命名路由。在我上面的例子中,它看起来像:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "", // Note that it is below the default route
            url: "{x}/{y}", // using both controller and action
            defaults: new { controller = "Home", action = "Calculate"}
        );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

现在,当您使用生成链接时,@Html.RouteLink您可以这样做:

@Html.RouteLink("My Link", new {controller = "Home", action = "Calculate", x = 1, y = 2 })

这将产生类似的东西:

http://www.VirtuoZ.com/Home/Calculate?x=1&y=2

更新 2:关于您对其他路线的请求,您始终可以依靠默认路线来生成信息,但是,您不能像评论中所说的那样生成路线:

http://www.example.com/abc文章和http://www.example.com/def产品

问题是路由是相同的,路由系统将选择可以满足您请求的第一条路由。可能会发生两个请求都由相同的路由提供服务。您需要区分这两条路线。因此,对于您的文章,请使用您定义的新路由,对于需要一个参数的其他事情,您将使用默认路由。

于 2013-06-30T11:02:47.233 回答
0

尝试这个:

routes.MapRoute(
"articlename", // Route name
"", // URL with parameters
new { action="DetailsByName",controller="Article" id="articleID"}, // parameter defaults 
new[] { "bssnew.Controllers" } // controller namespaces
);
于 2014-03-13T08:30:54.590 回答
0

[使用 ASP.NET MVC 命名路由][1]

http://dotnet.dzone.com/articles/named-routes-aspnet-mvc

于 2013-12-20T07:51:06.053 回答
0

我让它像这样工作。我认为这种实现方式更简洁,更容易理解(使用参数名称而不使用命名空间)。路由代码出现在默认路由上方,如下所示:

routes.MapRoute(
  name: "BlogPost",
  url: "{postId}",
  defaults: new { action = "Index", controller = "Blog" });

控制器看起来像这样:

public class BlogController : Controller
{
    public ActionResult Index(string postId)
    {
        ...
    }
}
于 2015-06-19T12:25:07.390 回答