2010-10-29 10 views
0

我有一个MVC2应用程序与形式(像你这样做)。在用户输入查询到窗体(在/汽车/索引视图)并点击了“提交”按钮,职位,以CarsController的详细行动 - 详细信息视图与渲染的结果,一切都很好,很好。MVC2 - 获取URL,以反映表单提交

用户可以输入一个URL(如/汽车/详细信息/ 123-125),他们得到的细节与123,124和125视图中显示,一样的,如果你进入它的形式。也很好,很好。

如果可能,我想启用的是当用户输入“123-125”或表单中的任何内容时,URL也反映结果 - 而不是网址的“/ Cars/Details”现在显示的是什么,我想让它显示“/ Cars/Details/123-125”。

对于我的生活,我无法弄清楚如何应该这样做。

任何帮助表示赞赏。

回答

0

好吧,这里是我想出了答案:

总之:重定向到GET

基本上,我写的有[HttpPost]属性的的行动,使用[HttpGet]属性将表单提交重定向到另一个操作。无论您提交表单还是手动输入URL,路由都可以工作。

[HttpPost] 
    public ActionResult Details(CarViewModel model, int? pageNbr) { 
    // simply takes the form POST and re-routes it as a GET to pretty up the URL 
    // (see second Details action) 
     int page = pageNbr ?? 0; 

     return RedirectToAction("Details", new { query = model.Query, pageNbr = page }); 
    } 

    [HttpGet] 
    public ActionResult Details(CarViewModel model, int pageNbr) 
    { 
     // various magic to create the view... 

     return View(avm); 
    } 

作为一个额外的好处,这需要照顾“你确定要重新提交吗?”当某人刷新页面或在浏览器中点击返回按钮时会感到烦恼。

0

将您的表单更改为GET而不是POST方法(POST为默认值),它应该可以正常工作。

<% using (Html.BeginForm("Action", "Controller", FormMethod.Get)) { %> 
+0

嗯,这是朝着正确方向迈出的一步 - 但是URL现在看起来是这样,这是接近但不完全:/汽车/详细信息查询= 123?我正在寻找/ Cars/Details/123 – 2010-10-29 19:21:28

+1

为了让URL看起来像你想要的,你可以为这种情况添加一个新的路线。你熟悉添加路线吗?路径规格将类似'/ Cars/Details/{* Query}',然后根据需要设置Controller和Action的默认值。 – 2010-10-29 19:34:02

+0

我编辑了上述内容并在查询前添加了星号;你需要确保你建议的短划线可以在值中不会导致路由混淆,并且认为你有两个单独的参数。 – 2010-10-29 19:35:40

0

这听起来像它没有找到/汽车/细节/ 123-125匹配的路线定义。我认为这可能是由于路由引擎的工作方式而发生的。

ASP.NET MVC Route Contraints with {ID}-{Slug} Format

+0

我不认为是这种情况 - 如果您在地址栏中输入/ Cars/Details/123-125,并按回车*它会起作用*。如果你使用表格,它也可以工作,但只有/ Cars/Details /。如果路线不在那里,它根本无法工作。 – 2010-10-29 19:31:57

+0

嗯......在你的表格中,你是在RouteData中传递123-125吗? – dotariel 2010-10-29 19:36:36

+0

ScottSEA说的;他的Controller Action可以正常工作,但Forms的默认设置是通过POST提交,但他希望通过GET进行提交,因此查询信息位于查询字符串中。路由确实有一些介入,因为他希望得到的URL出现。(请参阅我的回答评论) – 2010-10-29 19:37:30