提交表单时如何获取当前视图对应的Action名称?
解决复用上传Action后重定向到原视图的问题
核心问题原因
你当前获取的routeValues["action"]是当前请求的Action(即UploadImage)——因为表单明确提交到这个Action,原视图的Action信息不会自动携带到新请求里,必须手动传递。
推荐解决方案:通过隐藏字段传递原Action名称
这是最可靠的方式,在每个使用上传表单的视图里,添加隐藏字段存储原视图对应的Action名称,提交时一起传到UploadImage方法。
1. 修改视图中的表单
在Html.BeginForm内部添加隐藏域,用ViewContext获取当前视图的Action名称:
@using (Html.BeginForm("UploadImage", "Patient", FormMethod.Post, new { enctype = "multipart/form-data" })) { <!-- 其他表单元素 --> @Html.Hidden("returnAction", ViewContext.RouteData.Values["action"].ToString()) <input type="submit" value="上传图片" /> }
如果原视图可能属于不同Controller,还可以额外传递Controller名称:
@Html.Hidden("returnController", ViewContext.RouteData.Values["controller"].ToString())
2. 修改UploadImage Action接收参数并重定向
在Action方法中接收传递的returnAction(和可选的returnController),处理完上传后重定向到原Action:
public ActionResult UploadImage(HttpPostedFileBase imageUpload, PatientHomeViewModel model, string returnAction, string returnController = "Patient") { // 执行图片上传逻辑(省略具体实现) // 重定向到原视图对应的Action return RedirectToAction(returnAction, returnController); }
备选方案:通过Referrer解析原Action
如果不想修改视图,可以尝试从请求的Referrer头解析原页面的Action,但这种方式依赖浏览器发送Referrer,存在被用户禁用的风险,仅作为 fallback 方案:
public ActionResult UploadImage(HttpPostedFileBase imageUpload, PatientHomeViewModel model) { // 上传逻辑... if (Request.UrlReferrer != null) { var context = new HttpContextWrapper(HttpContext); var routeData = RouteTable.Routes.GetRouteData(context); if (routeData?.Values.ContainsKey("action") == true) { var returnAction = routeData.Values["action"].ToString(); var returnController = routeData.Values["controller"].ToString(); return RedirectToAction(returnAction, returnController); } } // 如果Referrer无效,重定向到默认页面 return RedirectToAction("Index", "Patient"); }
内容的提问来源于stack exchange,提问作者Salman Abbas
相关产品推荐
相关产品推荐

