无法从控制器方法中的窗体获取值

本文关键字:窗体 获取 方法 控制器 | 更新日期: 2023-09-27 17:49:38

我有一个MVC 4网站。. NET 4.5),其中我想重定向用户到一个非常简单的登录页面,如果他们试图获得访问网站的高分辨率照片(Hrp)部分。我已经设置了路由,他们似乎工作得很好,即用户被路由到"索引"页面或"登录"页面。然而,当我在HrpController的'Login'方法中接收数据时,用户名和密码字段是空的,即使我在表单上填写了它们。

应用程序的逻辑流应该如下所示:

  1. 用户进入索引页(/Hrp),如果用户没有登录,他们将得到登录表单
  2. 用户填写Login表单并提交给HrpController。登录(/合/登录)
  3. HrpController。登录方法应该获得用户名和密码,并对硬编码值进行验证(我知道这是非常弱的安全性,但它是对现有代码的重写,我不能随意更改机制)
  4. 如果用户名和密码与表单上输入的内容匹配,则用户将获得Hrp索引页(/Hrp)
  5. 如果用户名或密码不匹配,则将用户发送回登录页面(/Hrp/Login)

我不确定为什么用户名和密码值是空的,而不是包含用户在表单上填写的值。如有任何帮助,不胜感激。

路线:

        routes.MapRoute(
          name: "Hrp",
          url: "Hrp/",
          defaults: new { controller = "Hrp", action = "Index" }
        );
        routes.MapRoute(
            name: "HrpLogin",
            url: "Hrp/Login/",
            defaults: new { controller = "Hrp", action = "Login" }
        );
        routes.MapRoute(
            name: "HrpDetails",
            url: "Hrp/Details/{id}/",
            defaults: new { controller = "Hrp", action = "Details",
                            id = UrlParameter.Optional }
        );

的形式:

@using MyApp.App_Code;
@model MyApp.App_Code.Models.HrpUser

@using (Html.BeginForm("Login", "Hrp", FormMethod.Post)) 
{
    @Html.ValidationSummary(true, "Login failed. Check your login details.");
    <div>
         <div id="content" class="content">
            <section id="article">
                <div class="cont orangeTopBorder">
                    <fieldset>
                        <legend>Login</legend>
                        <div class="editor-label">
                            @Html.LabelFor(u => u.username)
                        </div>
                        <div class="editor-field">
                            @Html.TextBoxFor(u => u.username)
                            @Html.ValidationMessageFor(u => u.username)
                        </div>
                        <div class="editor-label">
                            @Html.LabelFor(u => u.password)
                        </div>
                        <div class="editor-field">
                            @Html.PasswordFor(u => u.password)
                            @Html.ValidationMessageFor(u => u.password)
                        </div>
                        <input type="submit" value="Submit"/>
                    </fieldset>
                    <div class="footerarticle">
                    </div>
                </div>
            </section>
        </div>
    </div>
}

控制器:

    public ActionResult Login(string username, string password)
    {
        if (username == "yourname" && password == "yourpassword")
        {
            SetHrpLogonAccepted();
            // Load Hrp object here, then show the main Hrp page
            return RedirectToAction("Index", hrp);
        }
        else
        {
            return View("Login");
        }
    }
    public ActionResult Index()
    {
        if (IsHrpLogonAccepted() == false)
        {
            return View("Login");
        }
        else
        {
               // Load Hrp object here, then show the main Hrp page
                return View("Index", hrp);
        }
   }

HrpUser:

    public class HrpUser
    {
        [Required]
        [Display(Name = "User name")]
        public string username { get; set; }
        [Required]
        [DataType(DataType.Password)]
        [Display(Name = "Password")]
        public string password { get; set; }
    }

辅助方法:

    private bool IsHrpLogonAccepted()
    {
        return Session["HrpLogonAccepted"] != null;
    }
    private void SetHrpLogonAccepted()
    {
        Session["HrpLogonAccepted"] = true;
    }

无法从控制器方法中的窗体获取值

尝试将login ActionResult更改为:

public ActionResult Login(HrpUser loginModel)
{
    if (loginModel.username == "yourname" && loginModel.password == "yourpassword")
    {
        SetHrpLogonAccepted();
        // Load Hrp object here, then show the main Hrp page
        return RedirectToAction("Index", hrp);
    }
    else
    {
        return View("Login");
    }
}

表单被作为POST提交到Hrp/Login,浏览器做301重定向到Hrp/Login/。在此重定向期间,它将数据作为GET而不是POST发送,因此它能够路由到我的HrpController。Login方法,因为它没有用[HttpPost]属性装饰,默认情况下它是一个GET。

为了解决这个问题,我现在用[HttpPost]属性装饰。

  [HttpPost]
  public ActionResult Login(HrpUser loginModel)

我还添加了一个斜杠"Login/":

@using (Html.BeginForm("Login/", "Hrp", FormMethod.Post))

既然我要做这个hack,我想我会看到做一个重定向,这样我的表单位于/Hrp/Login,可能我可以摆脱黑客只需使用:

@using (Html.BeginForm())