Как управлять ключами ошибок, используя ModelStateWrapper = - PullRequest
0 голосов
/ 03 февраля 2011

Я использую сервисный слой с ModelStateWrapper, как показано здесь .

Каким образом он должен управлять ключами ошибок, чтобы использовать их при проверке в слое обслуживания, чтобы они соответствовали именам ввода в моих представлениях?

например. У меня есть следующий ViewModel для клиента:

public class CustomerViewModel
{
    public string Name { get; set; }
    /*…*/
}

И следующий ViewModel для некоторых вариантов использования (в этом случае пользователь может создать двух клиентов на лету, введя их имена):

public class SomeOtherUseCaseViewModel
{
    public CustomerViewModel BuyingCustomer { get; set; }
    public CustomerViewModel SellingCustomer { get; set; }
    /*… */
}

Который я использую в представлении следующим образом:

<!-- … -->
<%: Html.EditorFor(model => model.BuyingCustomer.Name) %>
<%: Html.ValidationMessageFor(model => model.BuyingCustomer.Name) %>
<!-- … -->
<%: Html.EditorFor(model => model.SellingCustomer.Name) %>
<%: Html.ValidationMessageFor(model => model.SellingCustomer.Name) %>

В моей службе поддержки клиентов у меня есть следующий метод проверки, который вызывается при создании клиента (обратите внимание, что это другой класс Customer, это класс домена):

public bool ValidateCustomer(Customer customer)
{
    /* Check if there is another customer with the same name */
    if (/*…*/)
    {
        _validationDictionary.addError(“Name”, “There is another customer with the same name”); //the _validationDictionary holds the ModelStateWrapper
        return false;
    }
}

Вы видите мою проблему?

В зависимости от вида, ошибка должна быть добавлена ​​с помощью ключа “BuyingCustomer.Name” или “SellingCustomer.Name” (или в конечном итоге будет две ошибки, по одной с каждым ключом) вместо просто «Имя»; в противном случае фреймворк не будет правильно выделять поля и отображать ошибки.

Как правильно решить эту ситуацию? Я не хочу передавать «префикс ключа ошибки» на сервисный уровень, потому что это касается пользовательского интерфейса, а не сервисного уровня, (правильно?).

1 Ответ

1 голос
/ 04 февраля 2011

Позже, если вы запросите у службы какие-либо ошибки проверки?

Либо запросите службу сразу после проверки, затем сбросьте ошибки, либо попросите метод вызвать возвращаемые ошибки проверки. Если вы сделаете любой из них, вы можете добавить к ним префикс (prefix (this validationDictionaryObject, string pfx)) метод расширения словаря, API-интерфейс не будет таким уж плохим. Второй метод расширения (HasErrors ()) для словаря будет делать то же самое, что ваш логический возврат

В связи с проблемой, с которой вы столкнулись в одиночку, я стараюсь избегать запросов к сервису на предмет ошибок.

Удобно, чтобы служба собирала их все, но затем вы добавляете состояние ошибки в службу, которая на самом деле не принадлежит, дело не в том, что служба сломана, а в одной проверенной модели. Если вам нужно снова позвонить в эту службу (как вы это делаете), она имеет старое состояние. Вы должны справиться с этим. Либо это, либо возвращать ошибки, потому что в конце концов, это метод проверки. Пусть он вернет результаты проверки. :)

var errs = service.ValidateCustomer(sellinCustomer);
if (errs.HasErrors()){
   errs.Prefix("SellingCustomer");
   //add to model state dictionary for view here.
}
...