无法从控制器方法中的窗体获取值
本文关键字:窗体 获取 方法 控制器 | 更新日期: 2023-09-27 17:49:38
我有一个MVC 4网站。. NET 4.5),其中我想重定向用户到一个非常简单的登录页面,如果他们试图获得访问网站的高分辨率照片(Hrp)部分。我已经设置了路由,他们似乎工作得很好,即用户被路由到"索引"页面或"登录"页面。然而,当我在HrpController的'Login'方法中接收数据时,用户名和密码字段是空的,即使我在表单上填写了它们。
应用程序的逻辑流应该如下所示:
- 用户进入索引页(/Hrp),如果用户没有登录,他们将得到登录表单
- 用户填写Login表单并提交给HrpController。登录(/合/登录)
- HrpController。登录方法应该获得用户名和密码,并对硬编码值进行验证(我知道这是非常弱的安全性,但它是对现有代码的重写,我不能随意更改机制)
- 如果用户名和密码与表单上输入的内容匹配,则用户将获得Hrp索引页(/Hrp)
- 如果用户名或密码不匹配,则将用户发送回登录页面(/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())