0

我创建了一个注册页面,要求提供某些信息,例如电子邮件,这些信息在我的帐户数据库中应该只出现一次。如果数据库中已经存在具有表单中给出的电子邮件的帐户,我想重定向回注册页面,除非有一条消息警告用户错误。目前,这是我的控制器中处理注册请求的方法:

[HttpPost]
    public ActionResult RegisterTutor(Tutor tutor)
    {
        if (ModelState.IsValid)
        {
            foreach (Tutor t in db.Tutors)
            {
                if (t.Email == tutor.Email)
                {
                    return RedirectToAction("RegisterTutor"); //Send the user back to the registration page.
                    //What can I do here to send a message like "Email already registered" and display it on the registration page?
                }
            }

            tutor.Password = Cryptography.Encrypt(tutor.Password);
            db.Tutors.InsertOnSubmit(tutor);
            db.SubmitChanges();

            return RedirectToAction("Index", "Home");
        }
        else
        {
            return RedirectToAction("RegisterTutor");
        }
    }

我曾尝试使用 ViewBag 将消息传递给视图,但它不起作用。谢谢您的帮助。

4

2 回答 2

0

如果您考虑这里发生的事情,您正在创建一个新请求。RedirectTo Action 指示浏览器去获取另一个页面。当重定向到操作被点击时,浏览器会收到一个 302 代码,然后去获取另一个页面,在你的情况下,它会进入 registertutor 操作并获取响应,因此即使在重定向到操作之前或在它有效丢失之后你放置的任何内容。

你有几个选择,

您可以使用 tempdata 将消息传递给 registertutor 函数,该函数为下一个请求保留,因此 registertutor 中的视图可以使用 tempdata 在服务器上获取消息或某种缓存系统(我猜还有更多工作)。

希望有帮助。

于 2013-06-09T06:06:58.617 回答
0

您可以通过 ViewModel 中的自定义验证来实现这一点

public class User
    {

        [CheckEmail(ErrorMessage="Email Aready Exists")]
        public string Email { get; set; }
    }

    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property,
    AllowMultiple = false, Inherited = true)]
    public class CheckEmail : ValidationAttribute
    {
        public string UserEmail { get; set; }

        public override bool IsValid(object value)
        {
           //below code is to check the email against the database values. I've used LINQ with Entity Framework. You can use your own way to check the database.
            DataClasses1DataContext dc=new DataClasses1DataContext();
            bool email = (from tbuser in dc.tblClients
                         where tbuser.Email == value.ToString()
                         select tbuser).Any();

            if (email)
            {
                return false;//return false if email exists
            }

            return true;//return true if email does not exists
        }
    }

Now this validation is fired when you call ModelState.IsValid in your controller.

    if (ModelState.IsValid)//Validation fires here
    { 

    }
于 2013-06-09T06:57:12.293 回答