J'ai essayé de corriger la validation sur mon formulaire depuis un moment, mais je n'arrive pas à le faire fonctionner correctement. La validation fonctionne correctement, sauf si je saisis une adresse e-mail valide. Si je le fais, alors il saute toutes les autres validations pour une raison quelconque.Impossible de corriger la validation ASP.NET MVC
En outre, j'apprécierais des conseils au sujet de si je le fais bien avec la division de tout dans le contrôleur. Devrait-il y avoir 2 actions (1 pour GET pour charger simplement le formulaire vide et 1 pour POST quand l'utilisateur le soumet)? Est-ce que je fais quelque chose de mal là-bas?
EDIT: Correction: Si j'entre une adresse e-mail valide, le formulaire est correctement envoyé et ignore l'autre validation. Si je n'ai pas d'adresse email valide, la validation vérifie tout.
Voilà ma classe de modèle:
public class User
{
public int ID { get; set; }
[DisplayName("Name")]
[Required(ErrorMessage = "Name is required")]
public string Name { get; set; }
[DisplayName("Email")]
[DataType(DataType.EmailAddress)]
[Required(ErrorMessage = "Email is required")]
[RegularExpression(
@"^(?("")("".+?(?<!\\)""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))" +
@"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]{0,22}[a-z0-9]))$",
ErrorMessage = "Invalid email")]
public string Email { get; set; }
[DisplayName("Password")]
[DataType(DataType.Password)]
[Required(ErrorMessage = "Password required")]
[MinLength(6, ErrorMessage = "Min 6 characters")]
public string Password { get; set; }
}
Voici mon contrôleur:
public ActionResult Register()
{
ViewBag.LoggedIn = false;
return View();
}
[HttpPost]
public ActionResult Register(User user)
{
ViewBag.LoggedIn = false;
user.Password = PasswordHash.CreateHash(user.Password);
using (var context = new FoundationContext())
{
// if user exists
if (context.Users.FirstOrDefault(n => n.Email == user.Email) != null) return Login(true);
context.Users.Add(user);
context.SaveChanges();
}
return View("~/Views/Home.Index.cshtml");
}
Et voici ma forme:
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Email, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Email, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Email, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Password, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Password, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Password, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-10 text-center">
<input type="submit" value="Register" class="btn btn-primary" />
</div>
</div>
</div>
}
Et en bas bien sûr du corps comprend:
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/jqueryval")
@Scripts.Render("~/bundles/bootstrap")
@RenderSection("scripts", required: false)
Vous ne vérifie pas si le modèle est valable dans l'action HttpPost 'ModelState.IsValid '. – Scrobi