Проверка на уровне класса ViewModel - PullRequest
0 голосов
/ 06 января 2012

Я хочу проверить мою модель представления на уровне класса.

Я использую actionFilter. Как использовать аннотацию данных? а как внедрить базу данных Access?

Проверка, которая может произойти, если клиент говорит, что это уже наш клиент или нет.

Я использовал фильтр действий, но я думаю, что у него должен быть способ использовать DataAnnotation

прокомментировал следующий код:

public class DadosAssinaturaFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var model = filterContext.ActionParameters.Values.FirstOrDefault(x => x.GetType() == typeof(DadosAssinatura)) as DadosAssinatura;
        var modelState = filterContext.Controller.ViewData.ModelState;
        if (model != null)
        {
            var jaSouCliente = modelState.FirstOrDefault(x => x.Key == "JaSouCliente");
            if (jaSouCliente.Key != null)  // select "Is Clilent" radiobutton ?
            if (jaSouCliente.Value.Errors.Count > 0) // if so remove the errors of the registration data
            {
                modelState.RemoveKeysStartsWith("DadosCliente.");
                modelState.RemoveKeysStartsWith("DadosAcesso.");
            }
            else if (model.JaSouCliente != null && model.JaSouCliente.Value) // else, click in "Is Client"
            {
                modelState.RemoveKeysStartsWith("DadosCliente."); //remove 

                modelState.Remove("DadosAcesso.ConfirmaSenha"); //how injec UnitOfWor/Repository? AutoFac?
               if (unitOfWork.Client.GetClientByUser(model.DadosAcesso.Usuario, model.DadosAcesso.Senha) == null)//user and Password
                modelState.AddModelError("DadosAcesso.Usuario", "Usuario Nao Encontrado");
            }
            else if (model.DadosCliente.PessoaFisica) // is a company our people?
            {
                modelState.Remove("DadosCliente.RazaoSocial"); // remove validate for company name
                modelState.Remove("DadosCliente.Cnpj"); //the brazilian document of company
            }
            else modelState.Remove("DadosCliente.Cpf"); //the brazilian document of people
        }

        base.OnActionExecuting(filterContext);
    }
}

public static class ModelStateErros
{

    public static void RemoveKeysStartsWith(this ModelStateDictionary modelStateDictionary, string startsWith)
    {
        var keys = modelStateDictionary.Keys.Where(key => key.StartsWith(startsWith)).ToList();
        foreach (var variable in keys)
        {
            modelStateDictionary.Remove(variable);
        }
    }
}

извините, мой английский

1 Ответ

0 голосов
/ 06 января 2012

Просто реализуйте IValidateableObject в своем классе ViewModel (или создайте другой частичный класс), полностью избегайте фильтра и сохраняйте логику проверки с помощью ViewModel.

Как использовать IValidatableObject?

...