0

The goal

Show custom errors on the View using jQuery Validation.

The problem

Everything is working well. Yes... Everything! What I need is a light to a problem. I've already searched on Google and Stack but until now, no success.

Okay, lets go: my log in form composed by email and password is validating well — it throws a message if the email is invalid or if the password field is empty. But what I need is: throw a message if email + password combination doesn't exist on database, or, in other words, if the user doesn't exist.

Take a look in the following fragment:

[...]

[AcceptVerbs(HttpVerbs.Post)]
[ValidateAntiForgeryToken]
[AllowAnonymous]
public ActionResult Authenticate(User userModel)
{
    if (ModelState.IsValid)
    {
        if (userModel.IsValid(userModel.Email, userModel.Password))
        {
            FormsAuthentication.SetAuthCookie(userModel.Email, userModel.Remember);
            return RedirectToAction("Index");
        }
        else
        {
            ModelState.AddModelError(String.Empty, "Login data is incorrect!");
        }
    }
    return View(userModel);
}

[...]

Pay attention at this line:

ModelState.AddModelError(String.Empty, "Login data is incorrect!");

I want to display in the view "Login data is incorrect!" but I do not know how I can do this.

Code spotlight

I'm using jQuery Validation Unobtrusive and that's it — nothing more. I just called the script and the application goes on.

By the way, if necessary, follow some markup:

[...]
@using (Ajax.BeginForm("Authenticate", "Manager", 
           new AjaxOptions{ HttpMethod = "Post" })){
    <ul>
        <li>
            @Html.LabelFor(m => m.Email, "What's your email?")
            @Html.TextBoxFor(m => m.Email, "", new { placeholder = "Email" })
            @Html.ValidationMessageFor(m => m.Email)
        </li>
        <li>
            @Html.LabelFor(m => m.Password, "What's your password?")
            @Html.TextBoxFor(m => m.Password, "", new { placeholder = "Password" })
            @Html.ValidationMessageFor(m => m.Password)
        </li>
        <li>
            @Html.CheckBoxFor(m => m.Remember)
            Remember
        </li>
        <li>
            <button type="submit" class="btn btn-primary">Log In</button>
        </li>
    </ul>
}
[...]

To remember

I just call for the jQuery Validation's scripts and the (simple) validation that I marked as annotation at the top of the properties on model works like magic.

To improve the question comprehension, follow a sneak peak through User's model:

[...]

[Required]
[EmailAddress]
[DataType(DataType.EmailAddress)]
[Display(Name = "Email")]
public string Email { get; set; }

[Required]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }

[...]
Guilherme Oderdenge
  • 4,935
  • 6
  • 61
  • 96
  • Does this help? http://stackoverflow.com/questions/13465518/html-validationsummary-does-not-work-within-ajax-beginform – Jason P Aug 15 '13 at 21:18

1 Answers1

0

Assuming you have a method that checks for the user and returns a bool (true|false), Based on the return value you would use something like the following.

 if (!_userService.GetUser("userName"))
  {
    ModelState.AddModelError("UserName", "Account not found");
    return View();
  }
DfwForSale
  • 374
  • 2
  • 10