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

ASP.NET MVC and URL Rewriting

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