ASP.NET Core中如何在控制器Index方法获取输入控件值(验证码场景)
解决ASP.NET Core控制器获取验证码输入值的方法
首先你的视图缺少表单容器,导致提交按钮无法将输入数据发送到控制器,先修改cshtml代码,添加表单标签包裹输入控件:
@{ ViewData["Title"] = "Home Page"; } <div class="container"> <form method="post" asp-action="Index"> <label for="captcha"><b>Enter chaptcha - </b></label> <label id="lblshowCaptcha"><b>@ViewData["captcha"]</b></label> <input id="txtCapValue" type="text" placeholder="Enter captcha" name="cap" required> <br/> <button class="button" type="submit">Login</button> <br /> </form> </div>
然后在控制器中添加HttpPost标记的Index方法,用来接收用户提交的验证码值:
// GET请求:生成并展示验证码 public IActionResult Index() { var randnumber = RandomString(6); ViewData["captcha"] = randnumber; // 将生成的验证码存入Session,用于后续验证对比 HttpContext.Session.SetString("Captcha", randnumber); return View(); } // POST请求:接收并验证用户输入的验证码 [HttpPost] public IActionResult Index(string cap) { // 从Session取出之前生成的验证码 var storedCaptcha = HttpContext.Session.GetString("Captcha"); if (storedCaptcha != null && storedCaptcha.Equals(cap, StringComparison.OrdinalIgnoreCase)) { // 验证码验证通过,执行后续业务逻辑 return RedirectToAction("Success"); } else { // 验证失败,重新生成验证码并返回视图 var newRandNumber = RandomString(6); ViewData["captcha"] = newRandNumber; HttpContext.Session.SetString("Captcha", newRandNumber); ViewData["ErrorMessage"] = "验证码错误,请重新输入"; return View(); } } // 自定义生成随机验证码的方法 private string RandomString(int length) { var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; var random = new Random(); return new string(Enumerable.Repeat(chars, length) .Select(s => s[random.Next(s.Length)]).ToArray()); }
关键点说明:
- 必须用
<form>标签包裹表单元素,指定method="post"和asp-action="Index"(ASP.NET Core Tag Helper会自动生成正确路由)。 - 控制器需要两个
Index方法:一个处理GET请求生成验证码,一个用[HttpPost]标记处理POST请求接收输入值。 - 生成的验证码要存入Session(需在Program.cs中启用Session:添加
builder.Services.AddSession();和app.UseSession();),才能在验证时对比用户输入与真实验证码。 - 输入框的
name="cap"要和POST方法的参数名string cap一致,ASP.NET Core的模型绑定会自动把表单值映射到参数上。
如果需要在视图显示验证失败提示,可在cshtml中添加:
@if(ViewData["ErrorMessage"] != null) { <p style="color:red;">@ViewData["ErrorMessage"]</p> }
内容的提问来源于stack exchange,提问作者Arvind Chourasiya
相关产品推荐
相关产品推荐

