У меня есть приложение Asp.NET MVC, в котором я использую аннотации данных для добавления проверки в некоторых областях:DataAnnotations [Требуется] Атрибут не вызывает исключений быть выброшен
[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?
Спасибо за любую помощь
Edit:
Вот действие контроллера:
[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;
}
}
}
EDIT: Окончательный код, который работает и проверяет как и ожидалось, с помощью dataannotations. Благодаря кобыле.
[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);
}
Это зависит от кода вашего контроллера - в частности, как вы обновляете модель. Можете ли вы опубликовать полный метод действий? – Jon
Привет, Jon, спасибо за ответ hte. Я редактировал исходное сообщение, чтобы включить действие. Я сделал это так, чтобы избежать проблемы, с которой я столкнулся с Linq to Sql при обновлении. Я хотел бы услышать, есть ли там лучший способ? –
Три строки кода в вашем блоке try..catch не имеют ничего общего с моделью Validation и DataAnnotations, привязанными к вашей модели - здесь вы только «пытаетесь» выполнить эти три предложения, и если они работают нормально (и я предполагаю, что они делают потому что у них нет внутренней логики для проверки достоверности модели), тогда исключение не генерируется. Что вам нужно, это ModelState.IsValid, см. Мой ответ. – mare