model.isvalid mvc servicesstack плавно валидиране

Използвам библиотеката servicesstack и имам проблем с използването на библиотеката ServiceStack.FluentValidation.Mvc3, следвах стъпките за конфигуриране на тази библиотека, за да накарам asp.net mvc двигателя да разпознае свойството Model.IsValid, но това винаги е било вярно. Ето фрагмент от код за настройки за валидиране, които имам в моето приложение.

public class AppHost: AppHostBase
{
    public AppHost() : base("Api Services", typeof(AppHost).Assembly)
    {
    }
    //Provide extra validation for the registration process
    public class CustomRegistrationValidator : RegistrationValidator
    {
        public CustomRegistrationValidator()
        {
            RuleSet(ApplyTo.Post, () =>
            {
                RuleFor(x => x.DisplayName).NotEmpty().WithMessage("Ingresa tu nombre de usuario");
                RuleFor(x => x.LastName).NotEmpty().WithMessage("Ingresa tu apellido");
                RuleFor(x => x.Name).NotEmpty().WithMessage("Ingresa tu nombre");
            });
        }
    }

    public class CustomAuthValidator : AbstractValidator<Auth>
    {
        public CustomAuthValidator()
        {
            RuleFor(x => x.UserName).NotEmpty().WithMessage("Ingresa tu nombre de usuario").WithName("Nombre de Usuario");
            RuleFor(x => x.Password).NotEmpty().WithMessage("Ingresa tu contraseña").WithName("Contraseña");
        } 
    }
    public override void Configure(Container container)
    {
        container.Adapter = new WindsorContainerAdapter();

        Plugins.Add(new AuthFeature(() => new AuthUserSession(), new IAuthProvider[] {
            new CredentialsAuthProvider(),    
            new BasicAuthProvider()}));


        Plugins.Add(new RegistrationFeature());
        Plugins.Add(new ValidationFeature());

        container.RegisterAs<CustomRegistrationValidator, IValidator<Registration>>();
        container.RegisterAs<CustomAuthValidator, IValidator<Auth>>();

        FluentValidationModelValidatorProvider.Configure();

        container.Register<IRedisClientsManager>(c => new PooledRedisClientManager("localhost:6379"));
        container.Register(c => c.Resolve<IRedisClientsManager>().GetCacheClient()).ReusedWithin(Funq.ReuseScope.None);

        container.Register<IResourceManager>(new ConfigurationResourceManager());



        ControllerBuilder.Current.SetControllerFactory(new FunqControllerFactory(container));
        ServiceStackController.CatchAllController = reqCtx => container.TryResolve<AccountController>();

    }


    public static void Start()
    {
        new AppHost().Init();
    } 
}

грешките в съобщенията са по подразбиране, не променя името на етикетите, които бях задал в кода, който се показва.

Ето извлечението от кода, за да видите дали моделът е валиден или не, в контролера Account.

[HttpPost]
public ActionResult LogOn(Auth model, string returnUrl)
{
    //This always is true
    if (ModelState.IsValid)
    {
        //TODO: Save database and other action more
    }
    return View(model);
}

Моля помогнете.


person Emilio Montes    schedule 25.05.2013    source източник


Отговори (1)


Това трябва да работи, но не знам дали е най-доброто решение

Подклас Auth и го приписвайте с ValidatorAttribute

[Validator(typeof(CustomAuthValidator))]
public class MyAuth : Auth
{
}

Променете своя CustomAuthValidator, за да използвате новия тип MyAuth

public class CustomAuthValidator : AbstractValidator<MyAuth>
{
    public CustomAuthValidator()
    {
        RuleFor(x => x.UserName).NotEmpty().WithMessage("Ingresa tu nombre de usuario").WithName("Nombre de Usuario");
        RuleFor(x => x.Password).NotEmpty().WithMessage("Ingresa tu contraseña").WithName("Contraseña");
    }
}

Променете контролера си, за да приемете новия тип MyAuth

[HttpPost]
public ActionResult LogOn(MyAuth model, string returnUrl)
{
    //This should now work as expected
    if (ModelState.IsValid)
    {
        //TODO: Save database and other action more
    }
    return View(model);
}
person paaschpa    schedule 29.05.2013