我创建了一个注册页面,要求提供一些信息,例如电子邮件,这些信息只能在我的帐户数据库中出现一次。如果数据库中已存在一个帐户,并且表单中给出了电子邮件,我想重定向回注册页面,除非有一条消息警告用户该错误。目前,这是我的控制器中处理注册请求的方法:
[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将消息传递给视图,但它不起作用。谢谢你的帮助。
答案 0 :(得分:0)
如果您考虑一下这里发生的事情,那么您正在创建一个新请求。 RedirectTo Action指示浏览器转到另一个页面。当redirecttoaction被点击时,浏览器会收到一个302代码,然后进入并获得另一个页面,在你的情况下,它会进入registertutor操作并获得repsonse,所以你甚至在重定向到行动之前或在它被有效地丢失之后放了任何东西。 / p>
你有几个选择,
你可以使用tempdata将消息传递给registertutor函数,该函数保存用于下一个请求,因此registertutor中的视图可以使用tempdata获取消息或某种缓存系统(我猜的更多工作)服务器
希望有所帮助。答案 1 :(得分: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
{
}