簡體   English   中英

地圖路線asp.net mvc

[英]Map route asp.net mvc

我正在嘗試使我的網址友好。 我需要使用這種結構制作網址

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

如果您只需要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)
        {
            ...
        }
    }
}

我是通過詹姆斯的評論回復你的。 一個問題可能是你的路線看起來像這樣:

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=123http://www.example.com/Article/DetailsByName?articleId=123 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)));
}

現在,這是Index視圖的內容

<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獲取產品

問題是路由是相同的,路由系統將選擇可以為您的請求提供服務的第一條路由。 可能會發生兩個請求都由同一路由提供服務。 您需要區分這兩條路線。 因此,對於您的文章使用您定義的新路由以及其他需要一個參數的內容,您將使用默認路由。

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

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

嘗試這個:

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

我讓它像這樣工作。 我認為實現更簡潔,更容易理解(使用參數名稱和沒有命名空間)。 路線代碼顯示在默認路線上方,如下所示:

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

控制器看起來像這樣:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM