Je suis sûr que cela a déjà été demandé, mais j'ai essayé toutes les solutions données, mais aucune de la solution donnée ne résout mon problème. Probablement, je ne l'applique pas correctement. J'utilise MVC3, rasoir, jQuery.mvc3 - validation ajax formulaire et côté serveur
J'ai un nouveau formulaire d'inscription. Une fois l'enregistrement réussi, je souhaite afficher le message réussi (différent selon le type d'enregistrement) dans une boîte de dialogue.
En cas d'erreur avec ModelState, signifie ModelState.IsValid == false, je souhaite afficher les erreurs dans ValidationSummary.
Voir
function OnBegin() { alert('begin'); return $('form').validate().form(); }
function OnSuccess() { alert('success'); DisplaySucess()}
function OnFailure() { alert('failure'); }
function DisplaySuccess() {
var typeOfRegistration = $('input:radio[name=RegistrationType]:checked').val();
var msg;
if (typeOfRegistration == 0) {
msg = "You are successfully enrolled for Algebra classes.";
}
if (typeOfRegistration == 1) {
msg = "You are registered with your email address. Someone would contact you with an email.";
}
if (typeOfRegistration == 2) {
msg = "Thank you for filling up this form. One welcome packet would be delivered with in next 15 days";
}
msg = msg.replace(/\n/g, '<br />');
$('#dialog').html(msg);
$('#dialog').dialog('open');
}
@model Models.RegistrationModel
@using (Ajax.BeginForm("NewRegistration", "Account", new AjaxOptions() { OnBegin="OnBegin", OnSuccess = "OnSuccess", OnFailure = "OnFailure" }))
{
@Html.ValidationSummary()
<div>
Register<br />
@Html.RadioButton("RegistrationType ", "0", true) New Algebra class<br />
@Html.RadioButton("RegistrationType ", "1") New user registration by email<br />
@Html.RadioButton("RegistrationType ", "2") New user registration by mailing address<br/>
..some more types
</div>
<div>
…here I display/hide controls based on Registration type selected.
<div>
@Html.LabelFor("UserName")
@Html.TextBox("UserName")</div>
}
Contrôleur
public ActionResult NewRegistration(RegistrationModel model)
{
if (Request.IsAjaxRequest())
{
if (!ModelState.IsValid) {
//Ques: How do I display this in ValidationSummary.
return Json(new object[] { false, "Contains Email Address", ModelState.GetAllErrors() });
}
else {
if (UserNameIsTaken){
//Ques: This does not show in ValidationSummary
ModelState.AddModelError("_FORM", "This username is already taken. Please pick a different username.");
}
}
}
else if (!ModelState.IsValid) { return View(model); }
}
Modèle
public class RegistrationModel: IValidatableObject
{
[Required] //this gets displayed in ValidationSummary as Client-side validation
public string UserName { get; set; }
.. and all fields here
}
public IEnumerable<ValidationResult> Validate(ValidationContext context)
{
if (!string.IsNullOrEmpty(UserName) && UserName.Contains(EmailAddress)) {
yield return new ValidationResult("Username cannot contain email address", new[] { "UserName" });
}
}
Web.config a
UnobtrusiveJavaScriptEnabled = "true" et ClientValidationEnabled = "true"
.js fichiers inclus sont
script src = "@ Url.Content (" ~/Scripts/jquery-1.7.1.min.js ")" type = "text/javascript">
script src = "@ Url.Content (" ~/Scripts/jquery.validate.min.js ") "type =" text/javascript ">
script src = "@ Url.Content (" ~/scripts/jquery.validate.unobtrusive.min.js ")" type = "text/javascript">
scénariosrc = "@ Url.Content ("~/Scripts/jquery.unobtrusive-ajax.min.js") "type =" text/javascript ">
Qu'est-ce qui me manque ici? Toute alternative? Merci d'avance.
Après beaucoup d'essais et la lecture que j'eneded faire comme vous le suggérez. Je renvoie Json avec false comme premier paramètre de l'objet lorsqu'il y a une erreur côté serveur. Dans OnSucess, j'attrape les données de vérification d'erreur [0] == false (signifie erreur) et l'insère dans le balisage ValidationSummary. Merci. – peacefulmember