这可能是一个愚蠢的问题,因为当我用Google搜索时,我找不到任何人提出这个问题。但我的要求是不要在查询字符串中显示任何值。以下网址以明文形式显示名称和密码值,但我不希望它显示。
型号:
public class User
{
public int Id { get; set; }
public string Name { get; set; }
//public SecureString Password { get; set; }
public string Password { get; set; }
}
LoginController的视图:
@using (Html.BeginForm())
{
<div>@Html.Label("Username:")</div>
<div>@Html.TextBoxFor(model => model.Name)</div>
<div>@Html.Label("Password:")</div>
<div>@Html.PasswordFor(model => model.Password)</div>
<div>
<input type="submit"
class="btn btn-primary"
value="Login"
style="line-height:normal!important;" />
</div>
}
LoginController.cs
[HttpGet]
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(User user)
{
if (IsValidUser(user.Name, user.Password))
{
return RedirectToAction("Index", "Home", user);
}
return View();
}
答案 0 :(得分:1)
你不清楚自己想做什么。您还不清楚Index
动作方法的外观。所以我要继续在我面前看到的东西。
当你这样做时..
return RedirectToAction("Index", "Home", user);
..您正在重定向到HTTP GET
控制器中名为Index
的{{1}}操作方法。我不清楚这是一个空操作方法还是需要Home
实例的操作方法。
如果您不需要User
个实例,那么您可以这样做:
User
如果你确实需要一个return RedirectToAction("Index", "Home");
实例并且你不想将这些值作为URL中的参数传递,那么我建议你做这样的事情(这不是我理想的做法):< / p>
User
然后,您的[HttpPost]
public ActionResult Index(User user)
{
if (IsValidUser(user.Name, user.Password))
{
TempData["user"] = user;
return RedirectToAction("Index", "Home");
}
return View();
}
控制器的Home
操作方法将如下所示:
Index
现在您拥有public ActionResult Index()
{
User user = (User)TempData["user"];
return View();
}
变量的实例,可以相应地使用。
我希望这会有所帮助。
答案 1 :(得分:0)
正如其他人指出的那样,当您在GET
个请求中传递一些数据时,会使用查询字符串传递。因此,如果您不想在那里显示用户特定数据,则无法将user
对象保留在RedirectToAction()
中。
实现此类功能的一种方法是使用Session
变量:
在LoginController
:
if (IsValidUser(user.Name, user.Password))
{
Session.Add("user",user);
return RedirectToAction("Index", "Home");
}
return View();
在HomeController
,Index()
:
public ActionResult Index()
{
User user = (User)Session["user"];
Session.Remove("user");
//other logics here
return View();
}
答案 2 :(得分:0)
我用来更好地控制用户体验的另一种方法是通过ajax发布我的表单数据。
它有点多PT但它允许我与用户进行更多交互,因为我可以轻松地显示进度指示器或快速报告错误消息:
@using (Html.BeginForm())
{
<div>@Html.Label("Username:")</div>
<div>@Html.TextBoxFor(model => model.Name)</div>
<div>@Html.Label("Password:")</div>
<div>@Html.PasswordFor(model => model.Password)</div>
<div>
<input type="button"
class="btn btn-primary"
value="Login"
style="line-height:normal!important;" />
</div>
}
<script>
$('form button').on('click', function() {
Login();
});
function Login() {
$('#progress').show(); // indicate work is being done
var Name = $('#Name').val();
var Password = $('#Password').val();
var User = { "Name": Name, "Password": Password };
$.post('/Home/Login', User, function(data) {
if (!data.IsOk) {
$('#progress').hide(); // work complete, stop showing progress
alert(data.Message); // show an error message from the controller
}
else {
location.href = '@Url.Content("~/")';
}
});
}
</script>
这是过度简化的。你可以做更多。在我的情况下,我正在显示MDL对话框,其中包含错误消息和标题。
控制器看起来像这样:
[HttpPost]
public JsonResult Login(UserViewModel user)
{
try
{
if (IsValid(user))
{
generateCookie(user);
return Json(new { IsOk = true }, JsonRequestBehavior.AllowGet);
}
else
{
return Json(new { IsOk = false, Message = "Invalid user credentials" }, JsonRequestBehavior.AllowGet);
}
}
catch (Exception ex)
{
return Json(new { IsOk = false, Message = ex.Message }, JsonRequestBehavior.AllowGet);
}
}
再一次,我过度简化了这一点,以便为您提供它的要点。 Controller处理所有后端逻辑和数据库查询,View负责演示。
如果用户有效,Controller将向View返回一个真正的bool值,然后该值将重定向回主页,以便显示动态内容。
最后一点,值得一提的是MVC带有内置的登录功能,编写我们自己的功能可能要安全得多。我不确定如何使用它,但我几乎没有时间去弄清楚它,但它可能是你想要研究的东西。