如何在ASP.NET Core MVC的Action中接收表单输入?
解决ASP.NET Core MVC表单传递文本框内容到Action的问题
看起来你已经能触发目标Action,但数据没传过去,核心问题主要是请求方式和参数匹配的问题,下面给你两种最常用的解决方案,同时解答你关于Html.BeginForm的疑问:
方案一:修改现有手动表单(快速解决)
你的现有表单默认是GET请求,虽然GET也能传参数,但不适合文本内容(长度受限),而且如果你的Action标记了[HttpPost]的话就接收不到。只需要两步修改:
- 给表单添加
method="post"属性 - 确保Action的参数名称和textarea的
name属性完全一致
修改后的表单代码:
<div class="panel-body"> <form action="@Url.Action("updateStatus", "Home")" method="post"> <!-- 保留你原来的CSS类,样式不会丢失 --> <textarea class="greyback" id="w3review" name="w3review" rows="4" cols="50"> Update your status... </textarea> <br><br> <input class="input" type="submit" value="Submit"> </form> </div>
对应的Action代码(注意添加[HttpPost]特性):
[HttpPost] public IActionResult updateStatus(string w3review) { // 这里就能拿到textarea里的内容了 // 处理逻辑... return RedirectToAction("Index"); // 比如重定向回首页 }
方案二:使用Html.BeginForm(推荐,更符合MVC规范)
Html.BeginForm是Razor提供的HTML辅助方法,它会自动帮你生成正确的<form>标签(包括action和method),而且会自动添加防CSRF的令牌,代码更整洁。
怎么用?
用@using块包裹表单内容,块内可以写任何HTML元素(包括你的textarea,完全保留CSS类):
<div class="panel-body"> @using (Html.BeginForm("updateStatus", "Home", FormMethod.Post)) { <!-- 你的textarea完全保留原有样式和属性 --> <textarea class="greyback" id="w3review" name="w3review" rows="4" cols="50"> Update your status... </textarea> <br><br> <input class="input" type="submit" value="Submit"> } </div>
它的工作原理?
Html.BeginForm("updateStatus", "Home", FormMethod.Post):第一个参数是Action名称,第二个是Controller名称,第三个是请求方式(POST)using块会自动在结束时闭合<form>标签,避免手动写闭合标签出错- 默认会生成防CSRF的隐藏令牌(
<input name="__RequestVerificationToken" type="hidden" ...>),配合Action上的[ValidateAntiForgeryToken]特性,提升安全性
对应的Action代码(建议添加防CSRF验证):
[HttpPost] [ValidateAntiForgeryToken] public IActionResult updateStatus(string w3review) { // 处理文本内容 return RedirectToAction("Index"); }
关键注意点
- 参数名称必须匹配:textarea的
name属性值(这里是w3review)要和Action的参数名完全一致,ASP.NET Core才能正确绑定数据 - 优先用POST请求:textarea可能包含大量文本,GET请求的URL长度有限制,POST更适合传递这类数据
- 保留CSS样式:不管用哪种方式,只要保留HTML元素的
class属性(比如greyback、input),你的CSS样式就会正常生效
内容的提问来源于stack exchange,提问作者Grazosi




