【问题标题】:mvc2 - getting the URL to reflect the form submissionmvc2 - 获取反映表单提交的 URL
【发布时间】:2011-05-02 14:08:00
【问题描述】:

我有一个带有表单的 MVC2 应用程序(就像你做的那样)。用户在表单中输入查询(在 /Cars/Index 视图中)并点击“提交”按钮,该按钮发布到 CarsController 的 Details 操作 - Details 视图呈现结果,所有内容都是很好。

用户可以输入一个 URL(例如 /Cars/Details/123-125),然后他们将获得详细信息视图,其中显示 123、124 和 125,就像您在表单中输入的一样。也很好。

如果可能的话,我想要启用的是,当用户输入“123-125”或任何形式的 URL 时,URL 也会反映结果 - 而不是 URL 的“/Cars/Details”,这就是现在显示,我希望它显示“/Cars/Details/123-125”。

在我的一生中,我不知道该怎么做。

感谢任何帮助。

【问题讨论】:

    标签: asp.net-mvc-2 forms url-rewriting url-routing


    【解决方案1】:

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

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

    【讨论】:

    • 嗯,这是朝着正确方向迈出的一步 - 但现在 URL 看起来像这样,很接近但不完全:/Cars/Details?Query=123。我在找 /Cars/Details/123
    • 要使 URL 看起来像您想要的那样,您可以为这种情况添加一个新 Route。您熟悉添加路线吗?路径规范类似于/Cars/Details/{*Query},然后根据需要设置控制器和操作默认值。
    • 我编辑了上面并在Query前面添加了星号;您需要确保您建议的破折号可能在值中不会导致路由混淆并认为您有两个单独的参数。
    【解决方案2】:

    听起来它没有为 /Cars/Details/123-125 找到匹配的路线定义。我认为这可能是由于路由引擎的工作方式造成的。

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

    【讨论】:

    • 我不认为是这种情况 - 如果您在地址栏中输入 /Cars/Details/123-125 并按 Enter 它可以工作。如果您使用该表单,它也可以使用,但只有 /Cars/Details/。如果路线不存在,它就根本行不通。
    • 嗯...在您的表单中,您是在 RouteData 中传递 123-125 吗?
    • ScottSEA 所说的;他的控制器操作工作正常,但表单的默认设置是它们将通过 POST 提交,但他希望它通过 GET 完成,因此查询信息位于查询字符串中。不过,路由确实有一些参与,因为他希望生成的 URL 如何显示。 (请参阅我的答案中的 cmets)
    • 我在获取表单以使用 GET 提交值并根据路由规则格式化 URL 时遇到了类似的问题。
    【解决方案3】:

    好的,这是我想出的答案:

    简而言之:重定向到 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);
        }
    

    作为额外的奖励,这会处理“您确定要重新提交吗?”当有人刷新页面或点击浏览器中的“返回”按钮时会感到烦恼。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      相关资源
      最近更新 更多