MVC 4 Validation avec une vue partielle
Je suis en utilisant MVC 4 et Entity Framework pour développer une application web. Je travaille avec des vues partielles qui sont chargés avec du javascript. L'un d'eux est de créer un point de vue qui inclut la validation. Et c'est mon problème : la validation. J'ai une validation personnalisée logique et, par exemple, si un utilisateur entre certains chiffres dans un champ comme "Nom", il affiche une erreur.
Ici, avec les vues partielles, il me redirige sur mon partiel avec les erreurs affichées, mais ce que je voulais faire, c'est rester sur mon écran principal (Index) et garder ma vue partielle qui affiche les erreurs.
EDIT :
Voici ma vue partielle :
@model BuSIMaterial.Models.Person
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Person</legend>
<div class="editor-label">
First name :
</div>
<div class="editor-field">
@Html.TextBoxFor(model => model.FirstName, new { maxlength = 50 })
@Html.ValidationMessageFor(model => model.FirstName)
</div>
<div class="editor-label">
Last name :
</div>
<div class="editor-field">
@Html.TextBoxFor(model => model.LastName, new { maxlength = 50 })
@Html.ValidationMessageFor(model => model.LastName)
</div>
<div class="editor-label">
National number :
</div>
<div class="editor-field">
@Html.TextBoxFor(model => model.NumNat, new { maxlength = 11 })
@Html.ValidationMessageFor(model => model.NumNat)
</div>
<div class="editor-label">
Start date :
</div>
<div class="editor-field">
@Html.TextBoxFor(model => model.StartDate, new {@class = "datepicker", @placeholder="yyyy/mm/dd"})
@Html.ValidationMessageFor(model => model.StartDate)
</div>
<div class="editor-label">
End date :
</div>
<div class="editor-field">
@Html.TextBoxFor(model => model.EndDate, new { @class = "datepicker", @placeholder = "yyyy/mm/dd" })
@Html.ValidationMessageFor(model => model.EndDate)
</div>
<div class="editor-label">
Distance House - Work (km) :
</div>
<div class="editor-field">
@Html.EditorFor(model => model.HouseToWorkKilometers)
@Html.ValidationMessageFor(model => model.HouseToWorkKilometers)
</div>
<div class="editor-label">
Category :
</div>
<div class="editor-field">
@Html.DropDownList("Id_ProductPackageCategory", "Choose one ...")
@Html.ValidationMessageFor(model => model.Id_ProductPackageCategory) <a href = "../ProductPackageCategory/Create">Add a new category?</a>
</div>
<div class="editor-label">
Upgrade? :
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Upgrade)
@Html.ValidationMessageFor(model => model.Upgrade)
</div>
<br />
<div class="form-actions">
<button type="submit" class="btn btn-primary">Create</button>
</div>
</fieldset>
}
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
@Scripts.Render("~/bundles/jqueryui")
@Styles.Render("~/Content/themes/base/css")
}
De mon point de vue de l'Indice, j'ai ceci :
<div class="form-actions"><button type="button" id="create" class="btn btn-primary">Create</button> </div>
<div id ="create_person"></div>
Et la façon dont je charge ma Vue Partielle :
$("#create").click(function () {
var form = $("#create_person").closest("form");
form.removeData('validator');
form.removeData('unobtrusiveValidation');
$.validator.unobtrusive.parse(form);
$.ajax({
url: "/Person/CreateOrUpdate",
type: "POST",
data: $("#create_person").serialize(),
cache: false
});
// var url = '/Person/CreatePerson';
// $("#create_person").load(url);
});
Les actions :
[HttpGet]
public ActionResult CreateOrUpdate()
{
ViewBag.Id_ProductPackageCategory = new SelectList(db.ProductPackageCategories, "Id_ProductPackageCategory", "Name");
return View();
}
[HttpPost]
public JsonResult CreateOrUpdate(Person person)
{
ViewBag.Id_ProductPackageCategory = new SelectList(db.ProductPackageCategories, "Id_ProductPackageCategory", "Name", person.Id_ProductPackageCategory);
try
{
if (!ModelState.IsValid)
{
string messages = string.Join("; ", ModelState.Values
.SelectMany(x => x.Errors)
.Select(x => x.ErrorMessage));
throw new Exception("Please correct the following errors: " + Environment.NewLine + messages);
}
db.Persons.AddObject(person);
db.SaveChanges();
return Json(new { Result = "OK" });
}
catch (Exception ex)
{
return Json(new { Result = "ERROR", Message = ex.Message });
}
}
Donc je charge ma Vue Partielle comme je l'ai fait (avec .de charge) et de faire un appel ajax quand je clique sur le bouton créer ma vue partielle?
oui . u r droit. Par la façon dont sont u à l'aide de jQuery dialogue?
Merci beaucoup. Une dernière question alors que je suis en essais : l'appel ajax doit être placé dans ma vue partielle ou de la vue principale? Non, je ne suis pas à l'aide de jQuery dialogue, je pense à ce sujet, mais il semble vraiment compliqué et je suis de nouveau avec ces technologies.
mettre l'appel ajax dans un fichier de script java et charger le fichier js quand la vue index est chargé.
OriginalL'auteur Traffy | 2013-04-16
Vous devez vous connecter pour publier un commentaire.
Si vous affichez la page, il ne reviendra pas à la chargé dynamiquement vue partielle. Essayez de faire un appel ajax /Personne/CreatePerson. Votre CreatePerson ressemble à
`
En plus discrète à la validation de ne pas travailler facilement avec du contenu dynamique. vérifier le lien discrète validation sur dynamiquement ajoutés vue partielle (ne fonctionne pas)
Pour les données, ce qui n' #forme représente? Mon div où j'ai mis ma Vue Partielle?
Vous aurez à faire un appel ajax (comme le montre maintenant dans la réponse) lorsque le bouton Créer est cliqué. modifier le formulaire-actions div <div class="form-actions"> <button type="button" id="btnCreate" class="btn btn-primary">Créer</button> </div>
oui #forme est l'id du formulaire dans votre vision partielle.
Il ne fonctionne pas. Je vais mettre à jour mon code pour vous montrer ce que je fais.
OriginalL'auteur Faisal Ahmed
Je suis tombé sur ce scénario où ma Vue principale utilise Ajax postes pour récupérer PartialViews et offre le balisage de la PartialView dans mon point de Vue. J'utilise le jQuery, framework de validation à mettre en œuvre côté client discrète de validation.
Quand j'ai essayé de valider mon formulaire qui avaient été chargées dans la page via un appel Ajax, la validation ne semble pas fonctionner, mon formulaire tout simplement posté. Comme il s'avère, la discrète jQuery validateur bibliothèque analyse le balisage d'une page après il a fini de se charger de toutes les règles de validation sur la page. Le résultat est, jQuery ne sait pas que la dynamique ajouté une annotation a les règles de validation ne sont pas des erreurs de validation d'être jeté sur le post.
Solution
Traffy il y a une méthode qui est accessible au public dans le discret bibliothèque jQuery qui vous pouvez appeler, qui forcera l'analyseur pour analyser le balisage vous venez de charger. Pour ce faire, vous devez ajouter le code suivant à la PartialView (ou d'autres chargés dynamiquement le contenu)
Puis dans votre page parent, vous pouvez gérer la soumission du formulaire et de vérifier que le formulaire est valide comme cela;
Et c'est tout!! (Crédit: Dave codage)
OriginalL'auteur Umar Abbas
J'ai développé un décent solution de contournement pour ce. La page partielle ne vais pas vous montrer les erreurs de serveur sur la publication. Tout d'abord, nous obtenons les erreurs, à les renvoyer à la page, puis les créer en javascript & revalider la page. Heureusement, hop!
Dans votre contrôleur:
Je l'ai mis dans TempData de sorte qu'il peut être récupérer facilement de l'partielle. Oui, je l'ai appelé shepherdErrors, c'est mon idée pour que je puisse appeler le concept quel drôle de nom je veux! Berger les codes d'erreur à l'endroit où ils devraient être ou de la chose qui est l'idée générale.
Dans une classe helper:
Puis sur la page html quelque part après jquery en cours de chargement:
Cela devrait fonctionner hors de la boîte avec le général MVC développement des zones de texte qui sont générés sont basés sur les noms de variable - c'est le comportement par défaut de la MVC.
OriginalL'auteur ShrapNull