【问题标题】:mvc Html.BeginForm different URL schemamvc Html.BeginForm 不同的 URL 架构
【发布时间】:2023-04-08 19:02:02
【问题描述】:

我正在为 DropDown 创建一个表单,如下所示:

@{
    Html.BeginForm("View", "Stations", FormMethod.Get);
}
@Html.DropDownList("id", new SelectList(ViewBag.Stations, "Id", "Name"), new { onchange = "this.form.submit();" })
@{
    Html.EndForm();
}

如果我从下拉列表中选择一个值,我会被重定向到正确的控制器,但 URL 不是我想要的:

/Stations/View?id=f2cecc62-7c8c-498d-b6b6-60d48a862c1c

我想要的是:

/Stations/View/f2cecc62-7c8c-498d-b6b6-60d48a862c1c

那么如何将 id= 查询字符串参数替换为我想要的更简单的 URL 方案?

【问题讨论】:

  • 你不能。您的浏览器对您的路由配置一无所知。带有FormMethod.Get 的表单将始终将其控件的值作为查询字符串值回传(除非您要使用 javascript 拦截提交并构建自己的 url)
  • 好的,谢谢。如果您将此作为答案发布,我将接受它作为解决方案。 :)

标签: c# asp.net-mvc forms routing asp.net-mvc-routing


【解决方案1】:

带有FormMethod.Get 的表单将始终将其表单控件的值作为查询字符串值回发。浏览器无法根据您的路由配置生成 url,因为它们是服务器端代码。

如果你真的想生成/Stations/View/f2cecc62-7c8c-498d-b6b6-60d48a862c1c,那么你可以使用javascript/jquery来构建你自己的url并重定向

@using (Html.BeginForm("View", "Stations", FormMethod.Get))
{
    @Html.DropDownList("id", new SelectList(ViewBag.Stations, "Id", "Name"))
}

var baseUrl = '@Url.Action("View", "Stations")';
$('#id').change(function() {
    location.href = baseUrl + '/' $(this).val();
});

旁注:在.change() 事件上提交不是预期的行为,并且会使用户感到困惑。建议您添加一个按钮让用户进行选择,检查它然后提交表单(处理按钮的.click()事件而不是下拉列表的.change()事件)

【讨论】:

  • 如果您要求我添加答案以便您接受它,至少有礼貌这样做。
【解决方案2】:

删除“id” 来自

@Html.DropDownList("id", new SelectList(ViewBag.Stations, "Id", "Name"), new { onchange = "this.form.submit();" })

【讨论】:

  • 我应该用什么名字代替“id”?
  • 到目前为止我知道名字不是强制性的。正如您已经定义了表单的名称。默认情况下将分配此字段的名称。
  • Html.DropDownList 总是需要一个字符串值作为名称,方法的每个重载都需要它。
猜你喜欢
  • 1970-01-01
  • 2014-06-18
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
相关资源
最近更新 更多