J'ai une application MVC Asp.NET dans lequel j'utilise des annotations de données pour ajouter la validation à certains champs:DataAnnotations [Obligatoire] attribut ne provoque pas d'exception à jeter
[Required]
[DisplayName("Course Name")]
string Name { get; set; }
Toutefois, cela ne semble pas travailler comme je m'y attendais. Fondamentalement Si la page contient d'autres erreurs que je vérifie manuellement et lancez un nouveau RuleViolation(), alors la violation requise est montrée dans le résumé de validation. Si la violation requise est la seule erreur, elle n'est pas affichée.
Mon contrôleur a ce code dans le:
catch (Exception ex)
{
ModelState.AddModelError("", ex.Message);
ModelState.AddRuleViolations(courseViewModel.Course.GetRuleViolations());
return View(courseViewModel);
}
Mais étant donné que la violation requise est de ne pas jeter, je ne vais jamais ici. Dois-je faire quelque chose que je ne connais pas pour intercepter les erreurs provoquées par la violation de DataAnnotation?
Merci pour toute aide
Edit:
Voici l'action du contrôleur:
[HttpPost]
[ValidateInput(true)]
public ActionResult Edit(int id, CourseViewModel courseViewModel)
{
var oldCourse = _eCaddyRepository.GetCourse(id);
if (courseViewModel.Course == null)
{
return View("NotFound", string.Format("Course {0} Not Found", id));
}
try
{
courseViewModel.Update(oldCourse);
_eCaddyRepository.SubmitChanges();
return RedirectToAction("Index", "Course");
}
catch (Exception ex)
{
ModelState.AddModelError("", ex.Message);
ModelState.AddRuleViolations(courseViewModel.Course.GetRuleViolations());
return View(courseViewModel);
}
}
Où mise à jour est:
public class CourseViewModel : BaseViewModel
{
public Course Course { get; set; }
public void Update(Course oldCourse)
{
oldCourse.Name = this.Course.Name != null ? this.Course.Name.Trim() : string.Empty;
oldCourse.Postcode = this.Course.Postcode != null ? this.Course.Postcode.Trim() : string.Empty;
for (var i = 0; i < 18; i++)
{
oldCourse.Holes[i].Par = this.Course.Holes[i].Par;
oldCourse.Holes[i].StrokeIndex = this.Course.Holes[i].StrokeIndex;
}
}
}
EDIT: Code final qui fonctionne et valide comme prévu en utilisant des notifications de données. Merci à mare.
[HttpPost]
[ValidateInput(true)]
public ActionResult Edit(int id, CourseViewModel courseViewModel)
{
var oldCourse = _eCaddyRepository.GetCourse(id);
if (courseViewModel.Course == null)
{
return View("NotFound", string.Format("Course {0} Not Found", id));
}
if (ModelState.IsValid)
{
try
{
courseViewModel.Update(oldCourse);
_eCaddyRepository.SubmitChanges();
return RedirectToAction("Index", "Course");
}
catch (Exception ex)
{
ModelState.AddModelError("", ex.Message);
}
}
// Return Model with errors
ModelState.AddRuleViolations(courseViewModel.Course.GetRuleViolations());
return View(courseViewModel);
}
Cela dépend du code de votre contrôleur, en particulier de la mise à jour du modèle. Pouvez-vous poster la méthode d'action complète? – Jon
Bonjour Jon, merci pour votre réponse. J'ai modifié le post original pour inclure l'action. Je l'ai fait comme ceci pour éviter un problème que j'avais avec Linq à Sql lors de la mise à jour. J'aimerais entendre s'il y a un meilleur moyen? –
Les trois lignes de code de votre bloc try..catch n'ont rien à voir avec Model Validation et DataAnnotations jointes à votre modèle - ici, vous essayez seulement d'exécuter ces trois phrases et si elles fonctionnent bien (et je suppose qu'elles le font car ils n'ont pas de logique interne pour vérifier la validité du modèle) alors aucune exception n'est levée. Ce dont vous avez besoin est ModelState.IsValid, voir ma réponse. – mare