我正在努力让我的代码工作,但我认为我已经阅读了足够的信息,建议这是解决此问题的正确方法。
在我的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
答案 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以检查是否使用了查询字符串并重定向回相同的操作,这有点奇怪。