如何使用RouteConfig附加页面URL

时间:2014-12-16 10:29:07

标签: c# asp.net asp.net-mvc-4

我正在努力让我的代码工作,但我认为我已经阅读了足够的信息,建议这是解决此问题的正确方法。

在我的Intranet上,我希望用户输入一个单词来搜索文本框,然后选中checkbox。加载新页面时,我希望ASP.NET MVC的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

1 个答案:

答案 0 :(得分:2)

您无法完全使用路由来执行此操作,因为当浏览器属于GET请求时,浏览器将始终将表单值作为查询字符串参数发送。一旦请求被发送到服务器,MVC框架就无法对所使用的URL做任何事情。

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

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

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

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

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