.NET Core中视图向控制器传递returncontroller参数为空问题排查
问题分析与解决方案
这个问题的核心原因其实很容易被忽略:GET请求携带的参数不会自动传递到后续的POST请求中。你在传统MVC里能正常获取returncontroller值,大概率是因为当时的Create视图里已经隐式地把这个参数存成了表单隐藏字段,而迁移到.NET Core后,你的视图缺少了这个关键步骤。
具体原因拆解
- 你用
@Html.ActionLink生成的是指向ServiceRequestNotes/Create的GET请求链接,这个链接会把returncontroller=TeamServiceRequests作为URL参数带上。 - 点击链接跳转到Create的GET页面时,这个参数会被传递给GET版本的Create方法,但默认情况下,表单提交(POST)时,这个参数不会自动跟着走——除非你在表单里主动把它保存为隐藏字段。
修复步骤
1. 改造Create的GET方法,接收并传递参数
首先需要在ServiceRequestNotesController的GET版Create方法里接收returncontroller,并把它传递到视图中:
// GET: ServiceRequestNotes/Create public IActionResult Create(int ServiceRequest, string returncontroller) { // 把returncontroller存到ViewBag里,方便视图取用 ViewBag.ReturnController = returncontroller; // 保留原有逻辑 ViewData["ServiceRequest"] = new SelectList(_context.ServiceRequests, "Id", "RequestDescription", ServiceRequest); return View(); }
2. 在Create视图中添加隐藏字段
打开Create.cshtml,在表单内部添加一个隐藏输入框,把returncontroller的值存进去,这样POST提交时就会把参数带回去:
<form asp-action="Create"> <!-- 你的其他表单内容(比如NoteDescription输入框等) --> <!-- 新增隐藏字段,传递returncontroller参数 --> <input type="hidden" name="returncontroller" value="@ViewBag.ReturnController" /> <button type="submit" class="btn btn-primary">Save Comment</button> </form>
(可选)改用.NET Core Tag Helper生成链接
为了更贴合.NET Core的写法习惯,你可以把Html.ActionLink换成Tag Helper写法,效果完全一致:
<a asp-controller="ServiceRequestNotes" asp-action="Create" asp-route-ServiceRequest="@item.Id" asp-route-returncontroller="TeamServiceRequests"> New Comment </a>
验证效果
完成以上修改后,点击"New Comment"链接时,URL会包含?ServiceRequest=xxx&returncontroller=TeamServiceRequests,GET方法接收后把值传递到视图的隐藏字段中;提交表单时,这个参数会被包含在POST请求里,你的Create POST方法就能正确获取到returncontroller的值,从而跳转到TeamServiceRequests控制器的Index视图了。
内容的提问来源于stack exchange,提问作者Lyndon Sundmark
相关产品推荐
相关产品推荐

