MVC 5 - 如何避免数据在表单提交的地址栏中可见

时间:2016-05-18 06:17:33

标签: asp.net-mvc

这可能是一个愚蠢的问题,因为当我用Google搜索时,我找不到任何人提出这个问题。但我的要求是不要在查询字符串中显示任何值。以下网址以明文形式显示名称和密码值,但我不希望它显示。

  

http://localhost:30813/Home/Index/0?Name=test&Password=test

型号:

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();
}

3 个答案:

答案 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();

HomeControllerIndex()

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带有内置的登录功能,编写我们自己的功能可能要安全得多。我不确定如何使用它,但我几乎没有时间去弄清楚它,但它可能是你想要研究的东西。