ASP.NET MVC返回View(user)为何清除查询字符串?如何保留guid?
ASP.NET MVC 5 Post请求后保留Guid查询字符串的解决方法
核心问题原因
当Post请求验证失败直接返回View(user)时,MVC不会自动保留原Get请求的查询字符串参数,导致URL中的guid丢失。需要手动将guid传递回视图并确保表单提交时携带该参数。
方案1:显式传递Guid参数(推荐)
修改Post动作方法,添加guid参数,同时在视图中通过隐藏字段或路由参数携带guid,确保Post请求时能传递该值,返回视图时重新生成包含guid的URL。
控制器代码修改:
[HttpGet] public ActionResult ChangePassword(string guid) { // 将guid存入ViewBag,方便视图获取 ViewBag.Guid = guid; return View(); } [HttpPost] public ActionResult ChangePassword(string guid, clsUser user) { if (!ModelState.IsValid) { ViewBag.Guid = guid; // 返回视图时传递guid参数,确保URL保留查询字符串 return View(user); } else { // 执行修改密码的业务逻辑 return RedirectToAction("ChangePasswordSuccess"); } }
视图表单修改:
在表单中添加隐藏字段存储guid,或者在Html.BeginForm中指定路由参数:
@* 方式1:通过路由参数指定guid *@ @using (Html.BeginForm("ChangePassword", "Account", new { guid = ViewBag.Guid }, FormMethod.Post)) { <!-- 其他密码输入字段 --> @Html.EditorFor(model => model.Password) @Html.ValidationMessageFor(model => model.Password) <input type="submit" value="确认修改" /> } @* 方式2:添加隐藏字段携带guid *@ @using (Html.BeginForm()) { @Html.Hidden("guid", ViewBag.Guid) @Html.EditorFor(model => model.Password) @Html.ValidationMessageFor(model => model.Password) <input type="submit" value="确认修改" /> }
方案2:使用TempData暂存Guid
如果不想在方法参数中显式声明guid,可以用TempData临时存储该值,注意TempData默认是一次性读取,需要手动保留以便返回视图时使用。
控制器代码:
[HttpGet] public ActionResult ChangePassword(string guid) { TempData["ResetGuid"] = guid; return View(); } [HttpPost] public ActionResult ChangePassword(clsUser user) { var guid = TempData["ResetGuid"] as string; // 保留TempData值,避免后续读取时丢失 TempData.Keep("ResetGuid"); if (!ModelState.IsValid) { ViewBag.Guid = guid; return View(user); } else { // 执行业务逻辑 return RedirectToAction("ChangePasswordSuccess"); } }
视图修改:
同样需要在表单中添加隐藏字段或指定路由参数,确保Post请求时携带guid,方法同方案1。
方案3:返回视图时指定路由参数
返回View时直接传入路由参数,让MVC生成包含guid的URL:
[HttpPost] public ActionResult ChangePassword(string guid, clsUser user) { if (!ModelState.IsValid) { // 传入路由参数,URL会自动带上?guid=xxx return View(user, new { guid = guid }); } else { // 执行业务逻辑 return RedirectToAction("ChangePasswordSuccess"); } }
注意:此方案同样需要视图表单携带guid参数,否则Post方法无法接收到guid值。
内容的提问来源于stack exchange,提问作者Iman Shabanzade
相关产品推荐
相关产品推荐

