У меня есть приложение Asp.NET MVC, в котором я использую аннотации данных для добавления проверки в некоторые поля:
[Required]
[DisplayName("Course Name")]
string Name { get; set; }
Однако, похоже, это не работает так, как я ожидал.В основном, если страница содержит любые другие ошибки, которые я вручную проверяю и выдает новое RuleViolation (), то требуемое нарушение отображается в Сводке проверки.Если требуемое нарушение является единственной ошибкой, то она не отображается.
Мой контроллер содержит следующий код:
catch (Exception ex)
{
ModelState.AddModelError("", ex.Message);
ModelState.AddRuleViolations(courseViewModel.Course.GetRuleViolations());
return View(courseViewModel);
}
Но, учитывая, что требуемое нарушение не выдает, я никогда не уйдуздесь.
Нужно ли делать что-то, о чем я не знаю, чтобы перехватывать ошибки, вызванные нарушением DataAnnotation?
Спасибо за любую помощь
Редактировать:
Вот действие контроллера:
[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);
}
}
Где обновление:
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;
}
}
}
РЕДАКТИРОВАТЬ: окончательный код, который работает и проверяется в соответствии с ожиданиями, используя аннотации данных.Благодаря Маре.
[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);
}