2011-05-12 104 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