ASP.NET MVC and URL Rewriting
本文关键字:URL Rewriting and MVC NET ASP | 更新日期: 2023-09-27 17:56:30
在我的控制器中,我有 4 个 ActionResult (显示、搜索、修改和删除)用于视图。对于最后 3 个,有一个 RedirectToAction() 作为 Actionesult,在 Route 中我有一个自定义如下:
routes.RouteMap("Detail", "/Show/{id}", new { controller : "Administration", action : "Show", id : UrlParameters.Optional });
当我得到搜索结果时,我需要在 url 中添加 2 个参数。这 2 个参数在开机自检中发送。如何在 url 重写中添加此参数?
当我上来查看时
http://localhost/Show/1
搜索后
http://localhost/Show/1/foo/foo
感谢您对:)的帮助
[编辑] 经过一些测试,我找到了解决方案。表单和控制器处于开机自检状态,除非显示 (GET |帖子)。
有2条路线:
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
routes.RouteMap("Detail", "/Show/{id}/{p1}/{p2}", new { controller : "Administration", action : "Show", id : UrlParameters.Optional, p1: UrlParameters.Optional, p2: UrlParameters.Optional });
并将新参数添加到目标操作签名中。
本质上,
您正在做的事情对我来说似乎是不正确的。
您似乎正在尝试将查询参数作为路由值传递。
此外,使用多个可选参数进行路由也存在问题,请参阅:
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"] });
}
如果你得到这个想法:)
如果您希望将搜索结果发布到操作,然后重定向到操作,则可以使用 [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 });
}