我很难完成我的代码工作,但我想我已经读到了足够多的信息,表明这是正确的方法。
在我的intranet上,我希望用户输入一个单词来搜索文本框,并检查一个checkbox。当新页面加载时,我希望ASP.NET MVC的URL重写服务启动并从
mysite.com/?id=blah&isChecked=true至
mysite.com/home/index/blah/true我的代码不起作用,因为它不会产生错误,但不会做我正在解释的事情。因此,我已经删除了复选框,只关注textbox。
我唯一的路线是
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发布于 2014-12-16 10:58:16
不能仅仅通过路由来实现这一点,因为浏览器在作为GET请求的一部分时总是将表单值作为查询字符串参数发送。一旦将请求发送到服务器,MVC框架就无法处理所使用的URL。
这只剩下一个真正的选项(假设您不想使用JavaScript发送自定义请求),即显式地重定向到所需的URL (这意味着提交此表单时总是有两个请求)。
最简单的方法是在控制器中(而是在单独的控制器中,以确保方法签名中没有冲突):
public class FormController : Controller
{
public ActionResult Index(string MyType)
{
return RedirectToAction("Index", "MyProperController", new { MyType });
}
}如果您将表单定向到此控制器操作,MVC将使用路由引擎为实际操作生成适当的URL,并相应地重定向浏览器。
您可以从相同的控制器操作中执行此操作,但需要检查请求URL以检查是否使用了查询字符串,并将其重定向到相同的操作,这有点奇怪。
https://stackoverflow.com/questions/27502458
复制相似问题