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 });
}
}
<div class="form-actions"><button type="button" id="créer" class="btn btn-primary">Créer</button> </div> Cela devrait être dans la vue partielle de remplacer les <div class="form-actions"> <button type="submit" class="btn btn-primary">Créer</button> </div>
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