Domanda

Sto cercando di integrare NHibernate.Validator con le convalide lato client ASP.NET MVC e l'unico problema che ho riscontrato è che semplicemente non riesco a convertire il messaggio non interpolato in uno leggibile dall'uomo.Pensavo che sarebbe stato un compito facile, ma si è rivelata la parte più difficile della convalida lato client.Il problema principale è che, poiché non è lato server, in realtà ho solo bisogno degli attributi di convalida che vengono utilizzati e in realtà non ho un'istanza o altro a portata di mano.

Ecco alcuni estratti di ciò che ho già provato:

// Get the the default Message Interpolator from the Engine
IMessageInterpolator interp = _engine.Interpolator;
if (interp == null)
{
  // It is null?? Oh, try to create a new one
  interp = new NHibernate.Validator.Interpolator.DefaultMessageInterpolator();
}

// We need an instance of the object that needs to be validated, se we have to create one
object instance = Activator.CreateInstance(Metadata.ContainerType);

// we enumerate all attributes of the property. For example we have found a PatternAttribute
var a = attr as PatternAttribute;

// it seems that the default message interpolator doesn't work, unless initialized
if (interp is NHibernate.Validator.Interpolator.DefaultMessageInterpolator)
{
  (interp as NHibernate.Validator.Interpolator.DefaultMessageInterpolator).Initialize(a);
}

// but even after it is initialized the following will throw a NullReferenceException, although all of the parameters are specified, and they are not null (except for the properties of the instance, which are all null, but this can't be changed)
var message = interp.Interpolate(new InterpolationInfo(Metadata.ContainerType, instance, PropertyName, a, interp, a.Message));

So che quanto sopra è un codice abbastanza complesso per una domanda apparentemente semplice, ma sono ancora bloccato senza soluzione.Esiste un modo per estrarre la stringa interpolata da NHValidator?

È stato utile?

Soluzione

Ok, so che questa è una vecchia domanda, ma mi sono imbattuto in questa mentre provavo a fare la stessa cosa e mi ha aiutato a iniziare, quindi ho pensato di fornire una risposta.

Penso che il codice nella domanda fosse sulla strada giusta ma ci sono un paio di problemi.L'interpolatore non è stato completamente inizializzato con il file ResourceManager E Culture dettagli, e non sembra consentire il fatto che tu possa averne solo uno DefaultMessageInterpolator per attributo di convalida.Inoltre, non è necessaria un'istanza dell'oggetto che stai convalidando per ottenere un messaggio interpolato.

Nel codice nella domanda, dove stai inizializzando l'interpolatore con il valore dell'attributo, devi anche inizializzare l'interpolatore con i dettagli del ResourceManager da essere usato.

Questo può essere fatto utilizzando l'overloaded Initialize metodo attivo DefaultMessageInterpolator che porta la seguente firma:

    public void Initialize(ResourceManager messageBundle, 
                           ResourceManager defaultMessageBundle, 
                           CultureInfo culture)

Il primo parametro è un ResourceManager definito dall'utente nel caso in cui desideri utilizzare il tuo file di risorse per i messaggi di errore, puoi passare un valore null se desideri utilizzare solo il ResouceManager predefinito, il secondo parametro è il ResourceManager predefinito: puoi passare

  new ResourceManager( 
      NHibernate.Validator.Cfg.Environment.BaseNameOfMessageResource,
      Assembly.GetExecutingAssembly());

per questo, l'ultimo parametro è la cultura da utilizzare (NHibernate.Validator viene fornito con file di risorse con messaggi di convalida in diverse lingue) - se si passa un valore nullo a questo verrà semplicemente utilizzato CultureInfo.CurrentCulture

Infine, puoi averne solo uno DefaultMessageInterpolator per attributo, quindi dovrai crearne uno nuovo DefaultMessageInterpolator per ciascun attributo di convalida.Potresti utilizzare il DefaultMessageInterpolatorAggregator per gestire questo, o semplicemente lanciarne uno tuo.

Spero che questo aiuti qualcuno.

Altri suggerimenti

Grazie per tutto il vostro aiuto - I'd upvote se potessi. Volevo solo aggiungere che, oltre alla prima chiamata di inizializzazione sul DefaultMessageInterpolator che puzzava illustra, ho anche dovuto fare una seconda chiamata di inizializzazione diversa per inizializzare pienamente (mi è stato sempre alcune eccezioni Null riferimento utilizzando solo la prima chiamata). Il mio codice è il seguente:

string interpolatedMessage = "";
DefaultMessageInterpolator interpolator = new DefaultMessageInterpolator();

interpolator.Initialize(null,
    new ResourceManager(
        NHibernate.Validator.Cfg.Environment.BaseNameOfMessageResource,
        Assembly.Load("NHibernate.Validator")),
        CultureInfo.CurrentCulture);

interpolator.Initialize(attribute as Attribute);

if (attribute is IValidator && attribute is IRuleArgs)
{
    IValidator validator = attribute as IValidator;
    IRuleArgs ruleArgs = attribute as IRuleArgs;

    InterpolationInfo interpolationInfo = new InterpolationInfo(
        validatableType, 
        null, 
        propertyName, 
        validator,
        interpolator, 
        ruleArgs.Message);

    interpolatedMessage = interpolator.Interpolate(interpolationInfo);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top