ASP.NET MVC中如何通过POST请求传递值以隐藏URL参数?
解决隐藏URL参数并实现POST请求的问题
嘿,我来帮你搞定这个需求!你想要点击编辑按钮时不在URL里暴露参数,同时通过POST请求传递数据对吧?咱们先分析下现有代码的问题,再给出具体的修改方案。
问题分析
@Html.ActionLink的问题:它默认生成的是GET请求,而GET请求的参数必然会显示在URL中,所以你得到http://localhost:57098/Home/Edit/1这种带参数的URL是正常的,但不符合你隐藏参数的要求。- input按钮无效的原因:你之前的input按钮是提交到
Index的POST方法,然后通过RedirectToAction跳转到Edit的GET方法——Redirect本质是发起新的GET请求,参数还是会被放到URL里,而且这个流程绕了一圈,完全没必要。
解决方案
要隐藏参数,核心是用POST请求把参数放在请求体里,而不是URL中。我们需要修改Controller和View两部分:
1. 修改Controller代码
保留原有的HttpGet版Edit方法(用于直接访问编辑页面的场景),新增一个HttpPost版的Edit方法来处理表单提交:
[Authorize] [HttpGet] public ActionResult Edit(string ogrn) { var lpue = kz.LPUs.Where(x => x.C_OGRN.Contains(ogrn)).FirstOrDefault(); return View(lpue); } // 新增POST版Edit方法 [Authorize] [HttpPost] [ValidateAntiForgeryToken] public ActionResult Edit(string ogrn) { var lpue = kz.LPUs.Where(x => x.C_OGRN.Contains(ogrn)).FirstOrDefault(); return View(lpue); }
2. 修改View代码
把原来的ActionLink和input按钮替换成每行一个独立的POST表单,用隐藏字段传递参数:
@foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.M_NAMES) </td> <td> @Html.DisplayFor(modelItem => item.FAM_GV) </td> <td> @Html.DisplayFor(modelItem => item.TEL) </td> <td> @Html.DisplayFor(modelItem => item.FAX) </td> <td> @Html.DisplayFor(modelItem => item.E_MAIL) </td> <td> @using (Html.BeginForm("Edit", "Home", FormMethod.Post)) { @Html.AntiForgeryToken() <!-- 防止跨站请求伪造,必须和Controller的特性对应 --> @Html.Hidden("ogrn", item.M_NAMES) <!-- 把参数藏在隐藏字段里,POST时传递 --> <button type="submit" class="btn btn-primary btn-large">Изменить</button> } </td> </tr> }
为什么这样改?
- 每个行的表单会以POST方式提交到
Edit方法,参数ogrn会被放在请求体中,URL只会显示http://localhost:57098/Home/Edit,完全看不到参数。 @Html.AntiForgeryToken()是ASP.NET MVC的安全机制,和Controller里的[ValidateAntiForgeryToken]配合,能有效防止跨站请求伪造攻击。- 直接POST到
Edit方法,省去了中间跳转到Index的步骤,流程更简洁高效。
内容的提问来源于stack exchange,提问作者Андрей Голубцов
相关产品推荐
相关产品推荐

