2016-04-15 46 views
0

我越來越喜歡的網址http://localhost:49671/TestRoutes/Display?f=hi&i=2如何網址,而不是ID在mvc.net使用路由

只顯示名字,我想它像http://localhost:49671/TestRoutes/Display/hi

我把它從指數的方法。

[HttpPost] 
public ActionResult Index(int? e) 
{ 
    // return View("Display", new { f = "hi", i = 2 }); 
    return RedirectToAction("Display", new { f = "hi", i = 2 }); 
} 

索引視圖

@model Try.Models.TestRoutes 
@using (Html.BeginForm()) 
{ 
    Model.e = 5 ; 
    <input type="submit" value="Create" class="btn btn-default" /> 
} 

顯示行動方法

// [Route("TestRoutes/{s}")] 
public ActionResult Display(string s, int i) 
{ 
    return View(); 
} 

路由配置文件

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
    routes.MapRoute(
     "Professional", // Route name 
     "{controller}/{action}/{id}/{name}", // URL with parameters 
     new { controller = "TestRoutes", action = "Display", s = UrlParameter.Optional, i = UrlParameter.Optional 
    }); 
    routes.MapRoute(
     name: "Default", 
     url: "{controller}/{action}/{id}", 
     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional 
    }); 
+0

你的路由定義需要匹配參數名稱 - 「TestRoutes/Display/{s}/{i}」(只有最後一個參數可以是UrlParameter.Optional) –

+0

我無法正確編寫它,我可以使用屬性代替Maproute ? – Nil

+0

什麼不起作用?它只需要是'routes.MapRoute(name:「Professional」,url:「TestRoutes/Display/{s}/{i}」,新的{controller =「TestRoutes」,action =「Display」});'。但是在你的'Index()'方法中,它需要'return RedirectToAction(「Display」,new {s =「hi」,i = 2});'(不'f) –

回答

2

您需要將您的路線定義更改爲

routes.MapRoute(
    name: "Professional", 
    url: "TestRoutes/Display/{s}/{i}", 
    default: new { controller = "TestRoutes", action = "Display", i = UrlParameter.Optional } 
); 

使佔位符的名字在你的方法參數的名稱相匹配。另請注意,只有最後一個參數可以被標記爲UrlParameter.Optional(否則RoutingEngine不能匹配段和值將作爲查詢字符串參數,而不是路由值)

然後,你需要改變控制器的方法來匹配路由/方法參數

[HttpPost] 
public ActionResult Index(int? e) 
{ 
    return RedirectToAction("Display", new { s = "hi", i = 2 }); // s not f 
} 
+0

默認之前新:) – Nil

+0

懶惰剪切和粘貼:) –

+0

我沒有有意做它,我想這是一個錯誤的點擊,我甚至沒有意識到我什麼時候點擊。非常抱歉。 – Nil

0

改變你作爲 routes.MapRoute路線( 「專業」,//路線名稱 「{控制器}/{行動}/{名稱}」,//用參數URL 新 { 控制器= 「TestRoutes」, 行動= 「顯示」 } //參數默認值 );

public ActionResult Display(string name) 
{ 
    //action goes here 
} 
+0

我可能需要id屬性才能繼續操作。但即使我刪除它,我也無法看到URL中的任何更改。如果可能的話,你可以細化一下嗎? – Nil

+0

然後在route url中添加一個屬性route.MapRoute(「Professional」,「{controller}/{action}/{name}/{id}」, new {controller =「TestRoutes」, action =「顯示「, id = UrlParameter.Optional},以及像公共ActionResult顯示(字符串名稱,INT?ID){動作去這裏} – user3275644

0

你的行動中取出圖路線代碼: routes.MapRoute( 「專業」,//路線名稱 「{控制器}/{行動}/{ID}/{名}「,//帶參數的URL new {controller =」TestRoutes「,action =」Display「,s = UrlParameter.Optional,i = UrlParameter.Optional }); 使用屬性路由代碼: {Route(「TestRoutes/{s}/{i?}」)] public ActionResult Display(string s,int?i) { return View(); }

0

您也可以嘗試使用屬性路由。使用屬性路由可以更輕鬆地控制路由。

首先改變你的RouteConfig。CS這樣的:

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
     routes.MapMvcAttributeRoutes(); 
     //routes.MapRoute(
     // name: "Default", 
     // url: "{controller}/{action}/{id}", 
     // defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     //); 
    } 
} 

之後改變一樣,您的控制器文件:

namespace YourProjectName.Controllers 
{ 
    [RoutePrefix("Home")] 
    [Route("{action}/{id=0}")] 
    public class HomeController : Controller 
    { 
     [Route("Index")] 
     public ActionResult Index() 
     { 
      return View(); 
     } 

     [Route("ChangeAddress/{addressID}")] 
     public ActionResult ChangeAddress(int addressID) 
     { 
      //your codes to change address 
     } 
} 

您還可以瞭解更多關於屬性的路由在這篇文​​章: https://blogs.msdn.microsoft.com/webdev/2013/10/17/attribute-routing-in-asp-net-mvc-5/

+0

感謝您的鏈接,但我沒有得到您的解決方案。你的意思是我應該寫diff控制器進行路由嗎? – Nil

+0

不,** RouteConfig.cs **位於您的MVC項目的「App_Start」文件夾下。如果你想使用屬性路由,你必須改變你的RouteConfig.cs內容和你的其他控制器,比如在我的文章中。我認爲屬性路由是比常規路由更靈活的解決方案。你可以輕鬆控制你的路線。 – kkakkurt

+0

屬性路由不適合我(我無法使用它,我的意思是)我得到默認的網址與ID?等等 – Nil

相關問題