ASP.NET MVC中数据成功插入后如何传递用户输入数据至printRegInfo.cshtml页面展示
解决ASP.NET MVC插入数据后跳转展示信息的问题
没问题,我来给你梳理下怎么实现这个需求。你现在需要在数据成功插入数据库后,跳转到printRegInfo.cshtml页面展示用户输入的Name、PropName、Address信息,这里有两种常用且规范的方式,都能解决你的问题,同时遵循MVC的PRG(Post/Redirect/Get)模式,避免用户刷新页面重复提交表单:
方式一:通过RedirectToAction传递参数(URL传参)
这种方式直接将需要展示的信息作为路由参数传递,适合非敏感数据的场景。
1. 修改Create Action代码
在数据保存成功后,替换原来的return View();,改为跳转到专门的展示Action并传递参数:
public ActionResult Create(FirmServiceRegistrationViewModel firmServiceReg) { try { ViewBag.ServiceId = new SelectList(db.ServicesModels, "ServiceId", "ServiceName"); if (ModelState.IsValid) { FirmsModel frm_ = new FirmsModel(); frm_.Name = firmServiceReg.Name; frm_.PropName = firmServiceReg.PropName; frm_.Address = firmServiceReg.Address; db.FirmsModels.Add(frm_); db.SaveChanges(); int frmId = frm_.FirmId; FirmServiceRegistrationModel frmServReg = new FirmServiceRegistrationModel(); frmServReg.ServiceId_ = firmServiceReg.ServiceId; frmServReg.FirmId_ = frmId; db.FirmServiceRegistrationModels.Add(frmServReg); db.SaveChanges(); // 数据插入成功,跳转到PrintRegInfo并传递参数 return RedirectToAction("PrintRegInfo", new { name = firmServiceReg.Name, propName = firmServiceReg.PropName, address = firmServiceReg.Address }); } return View(); } catch (Exception) { throw; } }
2. 创建PrintRegInfo Action
在同一个Controller中添加接收参数并传递给View的Action:
public ActionResult PrintRegInfo(string name, string propName, string address) { // 将参数封装到ViewModel(复用你已有的FirmServiceRegistrationViewModel即可) var viewModel = new FirmServiceRegistrationViewModel { Name = name, PropName = propName, Address = address }; return View("printRegInfo", viewModel); }
3. 修改printRegInfo.cshtml页面
使用强类型ViewModel绑定数据,展示信息:
@model YourProjectNamespace.FirmServiceRegistrationViewModel <h2>注册成功信息</h2> <div class="reg-info"> <p><strong>公司名称:</strong> @Model.Name</p> <p><strong>负责人姓名:</strong> @Model.PropName</p> <p><strong>公司地址:</strong> @Model.Address</p> </div>
方式二:使用TempData存储数据(无URL暴露)
如果不想让信息出现在URL中,适合敏感数据的场景,可以用TempData临时存储数据(它会保留到下一次请求结束)。
1. 修改Create Action代码
数据保存成功后,将信息存入TempData再跳转:
public ActionResult Create(FirmServiceRegistrationViewModel firmServiceReg) { try { ViewBag.ServiceId = new SelectList(db.ServicesModels, "ServiceId", "ServiceName"); if (ModelState.IsValid) { // 省略数据保存代码(和你原来的一致) // 将信息存入TempData TempData["FirmName"] = firmServiceReg.Name; TempData["PropName"] = firmServiceReg.PropName; TempData["Address"] = firmServiceReg.Address; return RedirectToAction("PrintRegInfo"); } return View(); } catch (Exception) { throw; } }
2. 修改PrintRegInfo Action
从TempData中取出数据并传递给View:
public ActionResult PrintRegInfo() { var viewModel = new FirmServiceRegistrationViewModel { Name = TempData["FirmName"] as string, PropName = TempData["PropName"] as string, Address = TempData["Address"] as string }; return View("printRegInfo", viewModel); }
3. View页面和方式一完全相同
直接复用方式一的printRegInfo.cshtml即可。
注意事项
- 为什么不直接返回
View("printRegInfo", viewModel)?因为如果用户刷新页面,会重新执行Create的POST请求,导致重复插入数据,而RedirectToAction会发起新的GET请求,避免这个问题。 - 如果你没有专门的
FirmServiceRegistrationViewModel,也可以直接传递单个参数或者自定义一个简单的ViewModel来封装这三个字段。
内容的提问来源于stack exchange,提问作者nischalinn
相关产品推荐
相关产品推荐

