Необходимо скопировать свойства перед проверкой - PullRequest
1 голос
/ 25 мая 2010

У меня довольно сложная модель, которую необходимо проверить, проблема в том, что эта модель используется в двух разных местах: в одном месте, где вы регистрируете своего клиента, а в другом - просто при добавлении адресов. Некоторые поля в адресе просто не видны в форме регистрации клиента. Поэтому, когда я проверяю, если ModelState.IsValid я получаю false, конечно, так как, например. имя не указывается в адресе для выставления счета, но оно принадлежит клиенту. Вот почему я хочу до проверки, скопировать пару полей в модель, а затем проверить. Хотя я несколько растерялся и мне нужна помощь.

Мое действие выглядит примерно так:

public ActionResult Register(WebCustomer customer) 
{
     customer.CopyProperties();
     if(TryUpdateModel(customer)) 
     {
       ...
     }
     ...

Но он всегда возвращает false, а ModelState.IsValid продолжает оставаться false.

Ответы [ 3 ]

3 голосов
/ 25 мая 2010

Я думаю, что лучший подход в этой ситуации - написать CustomModelBinder и применить его к параметру действия

public ActionResult Register([ModelBinder(typeof(WebCustomerRegisterBinder))]WebCustomer customer)  
{
  if(TryUpdateModel(customer))  
  { 
    ... 
  } 
  ...
}

Этот CustomModelBinder должен заботиться о копировании полей, и поскольку он применяется к параметру действия, он будет использоваться только в этом действии.

1 голос
/ 25 мая 2010

Я решил это немного иначе, не уверен, что это лучший способ, но:

Сначала я создал метод расширения для ModelStateDictionary

public static void ResetErrors(this ModelStateDictionary modelState)
{
     foreach (var error in modelState.Values.Select(m => m.Errors))
 {
    error.Clear();
 }
}

тогда я сделал следующее в своем действии:

ModelState.ResetErrors();
customer.CopyProperties();
ValidateModel(customer);
1 голос
/ 25 мая 2010

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

public class Customer
{
    public bool IsValid()
    {
        //TODO: check properties.
    }
}

public ActionResult Register(WebCustomer customer) 
{
    customer.CopyProperties();
    TryUpdateModel(customer);
    if (customer.IsValid())
    {
        ...
    }
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...