如何使用 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

如何使用 RouteConfig 附加页面 URL

您不能纯粹使用路由来执行此操作,因为当表单值是 GET 请求的一部分时,浏览器将始终将表单值作为查询字符串参数发送。将请求发送到服务器后,MVC 框架无法对使用的 URL 执行任何操作。

这只剩下一个真正的选项(假设您不想使用 JavaScript 发送自定义请求(,即显式重定向到所需的 URL(这意味着提交此表单时您将始终有两个请求(。

最简单的方法是在控制器中

(而是在单独的控制器中,以确保方法签名中没有冲突(:

public class FormController : Controller
{
    public ActionResult Index(string MyType)
    {
        return RedirectToAction("Index", "MyProperController", new { MyType });
    }
}

如果将窗体定向到此控制器操作,MVC 将使用路由引擎为实际操作生成正确的 URL,并相应地重定向浏览器。

您可以从相同的控制器操作执行此操作,但它将涉及检查请求 URL 以检查是否使用了查询字符串并重定向回相同的操作,这有点奇怪。