如何使用 RouteConfig 附加页面 URL
本文关键字:URL 何使用 RouteConfig | 更新日期: 2023-09-27 18:34:18
我正在努力让我的代码工作,但我想我已经阅读了足够的内容,表明这是解决这个问题的正确方法。
在我的内部网上,我希望用户键入一个单词以搜索文本框,并检查checkbox
。当新页面加载时,我希望 MVC ASP.NET 的 URL 重写服务启动并从
mysite.com/?id=blah&isChecked=true
自
mysite.com/home/index/blah/true
我的代码在某种意义上不起作用,因为它没有给出错误,但没有做我所解释的。因此,我删除了复选框以仅关注文本框。
我唯一的路线是
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{MyType}",
defaults: new { controller = "Home", action = "Index", MyType = UrlParameter.Optional }
);
我的控制器
public ActionResult Index()
{
ViewBag.Message = "Modify this";
return View();
}
[HttpGet]
public ActionResult Index(string MyType)
{
ViewBag.Message = "..." + MyType;
return View();
}
我的观点有
@using (Html.BeginForm("Index", "Home",FormMethod.Get))
{
<input name="MyType" /><br />
<input type="submit" />
}
@Html.ActionLink("Click me", "Index", new { @MyType = "Blah" }) //renders correctly
问题是,它显示查询字符串仍在地址栏中
mysite.com/?MyType=MySearchValue
而不是
mysite.com/Home/Index/MySearchValue
您不能纯粹使用路由来执行此操作,因为当表单值是 GET 请求的一部分时,浏览器将始终将表单值作为查询字符串参数发送。将请求发送到服务器后,MVC 框架无法对使用的 URL 执行任何操作。
这只剩下一个真正的选项(假设您不想使用 JavaScript 发送自定义请求(,即显式重定向到所需的 URL(这意味着提交此表单时您将始终有两个请求(。
最简单的方法是在控制器中(而是在单独的控制器中,以确保方法签名中没有冲突(:
public class FormController : Controller
{
public ActionResult Index(string MyType)
{
return RedirectToAction("Index", "MyProperController", new { MyType });
}
}
如果将窗体定向到此控制器操作,MVC 将使用路由引擎为实际操作生成正确的 URL,并相应地重定向浏览器。
您可以从相同的控制器操作执行此操作,但它将涉及检查请求 URL 以检查是否使用了查询字符串并重定向回相同的操作,这有点奇怪。