ViewModel类级验证

时间:2012-01-06 15:17:17

标签: asp.net-mvc-3 repository data-annotations autofac

我想在课程级别验证我的视图模型。

我正在使用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 :(得分:0)

只需在ViewModel类中实现IValidateableObject(或创建另一个分部类)并完全避免使用过滤器,并使用ViewModel保留验证逻辑。

How do I use IValidatableObject?