2011-05-12 105 views
1

在我的控制器中,我有4個ActionResult(顯示,搜索,修改和刪除)視圖。對於最後的3,有RedirectToAction()作爲Actionesult和路線我有一個自定義爲這樣:ASP.NET MVC和URL重寫

routes.RouteMap("Detail", "/Show/{id}", new { controller : "Administration", action : "Show", id : UrlParameters.Optional }); 

我需要添加URL參數2時,我得到的搜索結果。這2個參數在POST中發送。 如何在url重寫中添加此參數?

當我來到上查看

http://localhost/Show/1 

搜索後

http://localhost/Show/1/foo/foo 

感謝您的幫助:)

[編輯]一些測試後,我找到了解決辦法。 表單和控制器在POST中除非顯示(GET | POST)。

有兩條路線:

routes.MapRoute(
       "RechercheEtablissementGucps", 
       "DetailGucps/{idGucps}/{CategorieEtablissementValue}/{SearchField}", 
       new { controller = "Administration", action = "AfficheDetailGuCPS", idGucps = UrlParameter.Optional, CategorieEtablissementValue = UrlParameter.Optional, SearchField = UrlParameter.Optional } 
      ); 

routes.MapRoute(
       "Gucps", // Route name 
       "DetailGucps/{idGucps}", // URL with parameters 
       new { controller = "Administration", action = "AfficheDetailGuCPS", idGucps = UrlParameter.Optional } // Parameter defaults 
      ); 

我如果另一個動作是做

/DetailGucps/29/DIR/fr 
+2

你不能把一個POST在一個URL。 – SLaks 2011-05-12 20:57:51

+0

嗯是的,但我不能在控制器或路由中添加此項? – 2011-05-12 21:03:18

+0

作爲@Slaks說你不能把一個POST放在一個URL中。而且因爲有了路線,你就可以定義你的網址的樣子,那麼你不能。 – 2011-05-12 21:13:13

回答

1
routes.RouteMap("Detail", "/Show/{id}/{p1}/{p2}", new { controller : "Administration", action : "Show", id : UrlParameters.Optional, p1: UrlParameters.Optional, p2: UrlParameters.Optional }); 

,並添加新的PARAMS到所希望如果我搜索並沒有那麼參數目標行動簽名。

+0

我有添加一個路由如上,它的工作原理:),但是當我有任何參數,url包含此「System.Web.Mvc.UrlParameter,系統.Web.Mvc.UrlParameter」。如何從url中刪除參數,當它爲空? – 2011-05-13 08:35:19

+0

是行動可空的參數? – iwayneo 2011-05-13 09:03:15

+0

我可以看到你的動作簽名? – iwayneo 2011-05-13 09:05:09

0

如果您希望將搜索結果發佈到Action並重定向到Action,您可以使用[AcceptVerbs(HttpVerbs.Post)]屬性和FormCollection,而不是在路由定義中命名Post參數。所以,你應該只定義了顯示路線:

 routes.MapRoute(
      "Show", // Route name 
      "Administration/Show/{id}", // URL with parameters 
      new { controller = "Administration", action = "Show", 
         id = UrlParameter.Optional } // Parameter defaults 
     ); 

的HttpVerb屬性將確保發佈的時候,你的職位是正確路由:

[AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult Show(int? id) 
    { 
     var showViewModel = new ShowViewModel(); 

     // ... populate ViewModel 

     return View(showViewModel); 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Modify(FormCollection form) 
    { 
     var id = form["id"]; 
     var p1 = form["p1"]; 
     var p2 = form["p2"]; 

     // ... Modify 

     return RedirectToAction("Show", new { id = id }); 
    } 
+0

不是我的願望;)我需要RedirectToAction並在URL中追加搜索結果。我嘗試這個例子,但沒有添加參數的地方。 – 2011-05-13 09:15:48

+0

@ User.Anonymous - 在你的問題中,你說你想用POST實現這一點,但這是不可能的 – 2011-05-13 09:31:27

+0

我試着用我的所有4種方法在GET(在窗體和控制器中),但現在我有404錯誤.. 。 – 2011-05-13 09:56:41

1
本質

你在做什麼,似乎不正確我。

看起來好像你試圖通過查詢參數路由值

也有使用路由多個可選參數的問題,請參見:

http://haacked.com/archive/2011/02/20/routing-regression-with-two-consecutive-optional-url-parameters.aspx

在你的行動將參數設置你期待,例如:

public ActionResult Show(int ID, string param1 = null, int? param2 = null) 
{ 
    return View(/*.GetShow(ID, param1, param2)*/); 
} 

[HttpMethod.Post] 
public ActionResult Show(FormCollection collection) 
{ 
    return RedirectToAction("Show", new { ID = collection["ID"], param1 = collection["param1"], param2 = collection["param2"] }); 
} 

如果你得到的想法:)

+0

謝謝你的例子,我會嘗試用這個更新我的代碼。我正在用逗號查找參數。 – 2011-05-13 14:01:25