Как лучше всего справиться с поздней проверкой данных, используя проверку аннотаций данных asp.net MVC 2? - PullRequest
2 голосов
/ 25 сентября 2010

Типичный сценарий, публикация в действии, которое проверяет ModelState.IsValid и, если это так, сохраняет в БД. Правила валидации устанавливаются как аннотации данных в модели.

Вот моя проблема. У меня есть поле данных, которое не может быть длиннее 400 символов. Аннотации данных обеспечивают это, а также проверку jQuery на стороне клиента.

Пользователь вводит 395 символов, включая несколько разрывов строк. Мое приложение превращает эти новые строки в <br /> теги. Но это после того, как UpdateModel() называется. Поскольку теги <br /> длиннее новых строк, он проходит проверку на UpdateModel, но завершается неудачно, когда фактически пытается сохранить данные в БД.

код, по сути, такой (от NerdDinner):

[HttpPost, Authorize]
public ActionResult Edit(int id, FormCollection collection) {

    Dinner dinner = dinnerRepository.GetDinner(id);

    try {
        UpdateModel(dinner, "Dinner");
        dinner.Description = dinner.Description.Replace("\n", "<br />");
        //... now it's over length limit

        dinnerRepository.Save();

        return RedirectToAction("Details", new { id=dinner.DinnerID });
    }
    catch {
        return View(dinner);
    }
}

Когда генерируется исключение, нарушения правил ModelState из аннотаций данных не заполняются, поэтому моим пользователям сообщение не отображается.

Какой хороший способ справиться с этим?

Ответы [ 2 ]

3 голосов
/ 25 сентября 2010

Вы должны быть в состоянии написать свой код как ...

if (TryUpdateModel(dinner, "Dinner")) {
    dinner.Description = dinner.Description.Replace("\n", "<br />");
    //... now it's over length limit

    if (TryValidateModel(dinner)) {
        dinnerRepository.Save();
        return RedirectToAction("Details", new { id=dinner.DinnerID });
    }
}

return View(dinner);

Это избавит от блока try {} и позволит вам проверить вашу модель.

2 голосов
/ 26 сентября 2010
...