地图路线asp.net mvc

时间:2013-06-30 09:30:03

标签: asp.net-mvc url seo maproute

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

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);

5 个答案:

答案 0 :(得分: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)
        {
            ...
        }
    }
}

答案 1 :(得分: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>

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

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

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

<强>更新: 如果您不打算在路线中使用{controller} / {action}且仅{articleId},则应将路线放在默认值之前,并且在生成链接时不要使用命名路线。在我上面的示例中,它看起来像:

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用于产品

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

试试这个:

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

答案 4 :(得分:0)

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

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

控制器看起来像这样:

public class BlogController : Controller
{
    public ActionResult Index(string postId)
    {
        ...
    }
}