2013-09-05 2 views
3

Проверенная модель MVC с использованием атрибутов DataAnnotations работает очень хорошо и значительно ускоряет разработку. Однако есть много случаев, когда валидация не может быть обработана на уровне представления приложения, например, проверка базы данных на уже существующие значения уникального свойства.ASP.NET MVC, решение для передачи сообщений проверки из проверки уровня сервиса для просмотра модели

Я ищу решение этой проблемы, которая удовлетворяет следующим требованиям:

  • Совместимость с Ninject (и другими методами DI).
  • Не сломать SoC. Сервисный уровень должен оставаться полностью не осведомленным о слое презентации.
  • Автоматический. Вызывает минимум дополнительного кода в (по крайней мере) уровне представления. Подумайте [ValidateServiceLayer] о методе действия.
  • Придерживается принципа сушки. Минимальное копирование кода.
  • Назначает сообщение проверки правильному свойству (при необходимости).
  • Позволяет добавлять другие сообщения проверки, как до, так и после запуска.

Дополнительные точки для этих функций:

  • Изящно ловит исключения и выводит пользователю сообщение об ошибке дружеский.
  • Простота использования. (Пакет NuGet?)

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

+0

** [Вы ищете удаленное подтверждение? Нет необходимости добавлять Nuget.] (Http://stackoverflow.com/a/18104060/2015869) ** –

+0

@PKKG: Интересно, что раньше я не запускал Remote Validation. Я чувствую, что это не соответствует моей цели, но я должен изучить ее немного ближе, прежде чем я могу быть уверен. Во всяком случае, может быть весьма полезно в других обстоятельствах! –

ответ

2

ASP.NET MVC предоставляет механизм, который может выполнять вызов удаленного сервера для проверки поля формы без отправки всей формы на сервер. Механизм под названием Удаленная проверка.

Пожалуйста, обратите внимание: http://msdn.microsoft.com/en-us/library/gg508808(v=vs.98).aspx

+0

Кажется, что RemoteAttribute может соответствовать счету. Тем не менее, я немного отстранен от всех «магических строк», необходимых для работы. –

3

Можно, конечно, использовать RemoteAttribute и что является законным решением, но я иногда выбрать другой подход. Я не уверен, что это лучшее решение, но это работает для меня, и я подумал, что это, возможно, стоит упомянуть.

Каждый один из моих классов моделей наследует от базовой модели, которая выглядит следующим образом:

public abstract class BaseModel 
{ 
    private ModelStateDictionary _modelState = new ModelStateDictionary(); 
    public ModelStateDictionary ModelState 
    { 
     get 
     { 
     return _modelState; 
     } 
     set 
     { 
     _modelState = value; 
     } 
    } 
} 

Таким образом, в моем контроллере я могу сделать что-то вроде:

[HttpPost] 
public ActionResult EditUser(user model) 
{ 
    if (ModelState.IsValid) 
    { 
     model.ModelState = ModelState; 
     _userService.Update(model); 
    } 
    if (ModelState.IsValid) 
    { 
     // Edit user was successful - No validation issues in business logic. 
     return View("Users"); 
    } 
    return View(model); 
} 

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

model.ModelState.AddModelError("Property Name", "Error Text"); 

только накладные расходы здесь является то, что в своем действии контроллера вы проверить ModelState.IsValid дважды, один раз, прежде чем звонить вашу службу и сразу после вызова Это.

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

ПРИМЕЧАНИЕ. Вам нужно будет добавить ссылку на сборку System.Web.Mvc на ваш уровень обслуживания, потому что класс ModelStateDictionary находится там, но я не думаю, что это проблема.

+0

Спасибо. Это похоже на хороший подход ко всем, но в моем случае служба не должна вступать в контакт с моими моделями просмотров, которые являются частью уровня представления в нашем решении. –

+0

@NicklasForss Служба не обязательно должна контактировать с вашими моделями просмотров. Я предполагаю, что у вас есть способ конвертировать модели представления в модели домена, вероятно, через AutoMapper? Если это так, то ModelState также будет отображаться так же, как и любое другое свойство ... – Marko

+0

@NicklasForss Еще лучше сделайте, чтобы ваши модели домена наследовали базовую модель, содержащую свойство ModelState, а затем, как только вы наберете свою модель представления в вашу модель домена, тогда просто присоедините ModelState к нему. Это на самом деле еще одна строка кода ... – Marko

Смежные вопросы