在映射网址时,Asp.net获取提交方法无效

时间:2015-04-23 14:16:40

标签: c# asp.net-mvc forms get asp.net-mvc-5

我有一个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方法可以正常工作。

如何解决这个问题?

1 个答案:

答案 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)