【问题标题】:How to retain values when I click on submit button inside form method="get"当我单击表单方法=\“get”中的提交按钮时如何保留值
【发布时间】:2022-10-18 10:21:55
【问题描述】:

当我单击表单标签中的Submit 按钮时,我在第一次加载页面时在变量中收集的值将被删除。我正在使用 In .Net Core MVC。

这是我的代码

public IActionResult Index(string cap)
{
    var rnumber = ViewData["captcha"];
    if (cap == rnumber)
    {
      Isvisble = "visible";
    }
    randnumber = RandomString(6);
    ViewData["captcha"] = randnumber;
    return View();
}

这是我的cshtml代码

<form method="get" asp-action="Index">
    <div class="container">
        <h1 class="display-4">Welcome</h1>
        <label for="captcha"><b>Enter chaptcha -  </b></label>
        <label id="lblCapval" for="captchasym"><b>@ViewData["captcha"]</b></label>
        <input id="txtCapValue" type="text" placeholder="Enter captcha" name="cap" required>
        <br />
        <button class="button" type="submit">Login</button>
    </div>
</form>

在这里,当我单击 submit buttonrandnumberViewData["captcha"] 时,Index 方法中的两者都是 null。我怎样才能保留这些价值观?

【问题讨论】:

    标签: asp.net-core .net-core asp.net-core-mvc


    【解决方案1】:

    ViewData 本身不能用于将数据从 View 发送到 Controller。您可以改用Session

    控制器:

    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;
        private readonly IHttpContextAccessor _httpContextAccessor;
        private readonly ISession _memorySession;
    
        public HomeController(ILogger<HomeController> logger, IHttpContextAccessor httpContextAccessor)
        {
            _logger = logger;
            _httpContextAccessor = httpContextAccessor;
            _memorySession = _httpContextAccessor.HttpContext.Session;
        }
    
        public IActionResult Index(string cap)
        { 
            var rnumber = _memorySession.GetString("captcha");
            if (cap == rnumber)
            {
                Isvisble = "visible";
            }
            string randnumber = RandomString(6);
            _memorySession.SetString("captcha", randnumber);
            return View();
        }
    }
    

    看法:

    @using Microsoft.AspNetCore.Http
    @inject IHttpContextAccessor httpContextAccessor
    @{
        ViewData["Title"] = "Home Page";
    }
    
    <form method="get" asp-action="Index">
        <div class="container">
            <h1 class="display-4">Welcome</h1>
            <label for="captcha"><b>Enter chaptcha -  </b></label>
            <label id="lblCapval" for="captchasym"><b>@httpContextAccessor.HttpContext.Session.GetString("captcha")</b></label>
            <input id="txtCapValue" type="text" placeholder="Enter captcha" name="cap" required>
            <br />
            <button class="button" type="submit">Login</button>
        </div>
    </form>
    

    不要忘记注册服务和中间件:

    builder.Services.AddSession();
    builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    app.UseSession();
    

    测试结果:

    另外需要注意的是,你的Index方法每次都会进入RandomString方法,如果要保存randnumber,需要添加判断条件。例如RandomString方法只有在rnumber==null时才会输入。

    您还可以使用输入将ViewData 作为字符串传递回控制器:

    <input type="hidden" name="captcha" value="@ViewData["captcha"]" />
    

    和你的控制器:

    public IActionResult Index(string cap ,string captcha)
    {
        var rnumber = captcha;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多