我有一个asp.net mvc表单,我想通过get方法将其提交到同一页面,它用于搜索目的。
url使用路由键值id映射。
@using (@Html.BeginForm("Contact", "Home",FormMethod.Get))
{
@Html.TextBox("id", null,
new
{
type = "time"
}
);
<input type="submit" />
}
生成表单时,操作属性包含键值,例如 / Home / Contact / myname 。
此处 myname 是网址中存在的ID值。
当提交表单时,id的值键值将附加到URL,如
http://localhost:57247/Home/Contact/myname?id=11%3A11
操作方法是读取myname值而不是 11%3A11 。
行动方法:
public ActionResult Contact(string id)
{
ViewBag.Message = id;
return View();
}
使用post方法可以正常工作。
如何解决这个问题?
答案 0 :(得分:2)
替换@Html.BeginForm("Contact", "Home",FormMethod.Get)
与@Html.BeginForm()
默认情况下,表单会被发送到它们呈现的相同URL,默认方法是get。
@Html.BeginForm()
默认生成METHOD =“POST”
至于您的参数,您可能希望以不同的方式命名。 默认Mvc路由配置如下
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
取决于mvc版本,它可以在global.asax或App_Start \ routeconfig.cs中
因此,url中的“MyName”与default id参数完全匹配,优先级高于查询字符串参数。 如果您以不同的方式命名参数(不是id)。 例如,在操作和视图中将其更改为“q”。 您的网址将更改为/ Home / Contact?q = myname,所有内容都应按预期开始工作。
现在你说你想要一个带有url映射的解决方案。 所以你必须自己弄清楚你想要的网址方案。
如果你有一个表格,并希望它发布到/ home / contact / myname?id = notyourname,那么你要解决的冲突不得不以某种方式改变mvc中的绑定优先级。
现在,您可以在操作中自行检查查询字符串,并找出未绑定的新ID。之后,您可以返回RedirectToAction("Contact", new{id = figuredId})
,浏览器中的网址将是您想要的网址。
您可以更改查询参数名称,并让您的操作接收2个参数
public ActionResult Contact(string id, string q){
if (!string.IsNullOrWhitespace(q)){
return RedirectToAction("Contact",new{id=q});
}
}
要向/ Home / Contact发送请求,您应使用@Html.BeginForm("Contact","Home",new{id=null}, FormMethod.Get)