验证凭据而不离开视图

时间:2014-06-17 11:51:01

标签: c# asp.net-mvc

我有一个用户登录页面,我想检查插入的凭据是否正确。这是控制器:

编辑:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SustIMS.Models;

namespace SustIMS.Controllers
{
    public class MainController : Controller
    {
        public static string userName;
        public static string password;

        public ActionResult Index()
        {
            getCredentials();
            if (Authenticate(userName, password))
            {
                return View();
            }

            ModelState.AddModelError("", "Could not authenticate");
            return Redirect("../Home");
        }


        public void getCredentials()
        {

            if (Request["username"] != null && Request["password"] != null)
            {

                userName = Request["username"].ToString();
                password = Request["password"].ToString();

            }
        }
    }
}

如果插入的凭据正确,则一切正常:Authenticate函数会验证该凭据,如果它返回true,则ActionResult会返回View

但是,如果它们不正确,我会将其设置为返回null,转而转到空白页。

我希望它保持在同一页面并向用户显示某种消息,通知凭据不正确(通过显示div,通过弹出窗口调用javascript函数窗口,......,我真的不知道。)

我该怎么做?

由于

修改

以下是我的观点:

@{
    Layout = null;
}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <title>@ViewBag.Message</title>
    @Styles.Render("~/Content/css")
    @Scripts.Render("~/bundles/modernizr")
    @Scripts.Render("~/bundles/jquery")

</head>

<body>

    <div id="outer-limit">

        <div class="logo-main">
            <a href="../Home/Index">

                <img class="displayed" src="../../Images/logo.png" alt="SustIMS" /></a>
        </div>

        <section class="container">

            @Html.Partial("LoginForm")
            @Html.ValidationSummary()

        </section>

    </div>
</body>
</html>

部分LoginForm

<div class="login">
    <h1>@ViewBag.Login</h1>
    <form method="get" action="../Main/Index">
    <p>
        <input type="text" name="username" value="" placeholder="Username" maxlength="30"></p>
    <p>
        <input type="password" name="password" value="" placeholder="Password" maxlength="25"></p>
    <br />
    <br />
    <p class="submit">
        <input type="submit" onclick="Refresh()" name="commit" value="Login"></p>
    </form>
</div>

3 个答案:

答案 0 :(得分:1)

做这样的事情应该有效。检查ModelState可以/将通过视图上的属性验证必填字段(如果您已实现它们),否则您可以在操作中手动处理。在返回视图之前添加模型错误将导致错误在重新加载后显示在页面上。验证成功后,我们将重定向到另一个操作。

public ActionResult Index(LoginModel model) {
  if (ModelState.IsValid) {
    if (AuthenticateUser(model)) {
      return RedirectToAction("LoggedIn");
    } else {
      ModelState.AddModelError("", "Could not authenticate"); //or better error
    }
  }

  return View(model);
}

请务必在视图中添加@Html.ValidationSummary()以显示返回的错误消息。

您应该能够定制上述代码以使用您的方法,但最终,我建议您强烈输入您的视图并将模型传回一个帖子。

修改 根据上面的代码重新编写我的示例,而不是一般示例

public ActionResult Index()
{
    getCredentials();
    if (Authenticate(userName, password))
    {
        return View();
    }

    ModelState.AddModelError("", "Could not authenticate");
    return View();
}

我的建议是在成功验证后RedirectToAction,而不是返回相同的视图。

答案 1 :(得分:0)

我相信你对ASP.NET MVC的工作原理有错误。如果您提交表单,则会发出全新请求,并显示其响应 - 也就是说,您必须返回一些内容以显示给用户 - 通常是视图。永远不要返回ActionResult。在您的情况下,在两种情况下都返回View(),只是给它显示不同的数据 - 例如成功消息或错误消息。您可以为此使用strongle类型模型,或ViewBag - 查看一些教程。

如果您希望用户在凭据错误时“停留在同一页面上”,则需要进行某种ajax验证。 ASP.NET MVC也支持这一点,看看http://msdn.microsoft.com/en-us/library/gg508808(vs.98).aspx

答案 2 :(得分:0)

一种方法:

public ActionResult Index(string url)
    { 
        getCredentials();

        if (Authenticate(userName, password))
        {
          return View(); 
        }
        else
        {
          TempData["ErrorMessage"]="Wrong Credential";
          return Redirect(url);
        } 
       }
    }

然后在您的视图中显示div中的消息,如果它不是空的

@if(TempData["ErrorMessage"] != null)
{
  <div class='alert alert-success alert-dismissable' >
  @TempData["ErrorMessage"] 
  </div>
}