Yes, object graph validation would be helpful in such scenarios, but this means that the validator would have to know about lazy loaded related entities and not validate them, which would couple it to ActiveRecord (i.e. NHibernate) stuff.
Regarding client side validation, I am using it with Prototype (plan to switch to JQuery) and it works fine, without interfering with server side validation. I can't see how they could clash. When you submit a form, do you get to your action method? create On Tue, Jul 28, 2009 at 11:22 AM, bdaniel7 <[email protected]> wrote: > > > HasValidationError returns false for incident and true for > incident.Address. > > I'll consider checking for validity both incident and incident.Address > as a workaround.. > because i would have expected for this to work on both main entity and > its related entities, maybe the entire object graph. > imagine having a class with several [BelongsTo(otherClass)]. > > Another issue that i discovered, is that when client validation is > enabled (jQuery in my case), server validation is not performed > anymore. > Again i don't find this normal (but this is another discussion). > > Anyway, thank you for pointing out the entity/entity graph validation > issue. > > Dan > > > On Jul 28, 12:06 pm, Zdeslav Vojkovic <[email protected]> > wrote: > > if HasValidationError returns true, you are not even getting to the Save > > part, right? > > In your case, I would expect HasValidationError to return false when > Address > > fields > > are empty, but the incident.Save would be called and throw the error you > > mentioned. > > This is the expected behavior. Are you saying that this is not happening > or > > do you > > expect something else to happen? > > > > HasValidationError works on an entity, not on an entity graph (please > > someone correct > > me if I am wrong). Address is a different entity, so the check is not > > propagated (please note > > that [Nested] objects are different story). > > > > You could try something like if ( HasValidationError( incident ) || if ( > > HasValidationError( incident.Address ) )) > > > > > > > > On Tue, Jul 28, 2009 at 10:54 AM, bdaniel7 <[email protected]> wrote: > > > > > before tx I check if the instance is valid with: > > > if ( HasValidationError( incident ) ) > > > { > > > Flash["incidentform"] = incident; > > > Flash["summary"] = GetErrorSummary( incident ); > > > } > > > else > > > Save > > > > > the HasValidationError return true and i get a validation error on > > > Save/Create: > > > "Can't save or update as there is one (or more) field that has not > > > passed the validation test" > > > > > On Jul 28, 11:44 am, Zdeslav Vojkovic <[email protected]> > > > wrote: > > > > how does you controller code look like? I would expect something > > > equivalent > > > > to this: > > > > > > using (TransactionScope tx = new > > > TransactionScope(TransactionMode.Inherits)) > > > > { > > > > Incident i = ... // instantiate a new incident > > > > i.Create(); // add it to the session, to be flushed on > commit > > > > tx.VoteCommit(); > > > > > > } > > > > > > in this case, validation should kick in during the saving for all > objects > > > > which are saved/updated. > > > > Are you doing something different? > > > > > > On Tue, Jul 28, 2009 at 10:18 AM, bdaniel7 <[email protected]> > wrote: > > > > > > > I'm interested mainly in the instance to be validated in the > > > > > controller, during save/update operations. > > > > > However this doesn't happen either. > > > > > > > On Jul 28, 11:14 am, Zdeslav Vojkovic <[email protected]> > > > > > wrote: > > > > > > AFAIK, validation is not propagated to related objects when > executed > > > > > > explicitly like in your test. > > > > > > However, it will be performed during Save()/Update() for each > > > > > saved/updated > > > > > > object in the graph. > > > > > > > > IMO, this makes sense because the related object might be lazy > > > loaded, so > > > > > in > > > > > > order to validate it, > > > > > > it has to be retrieved from the DB first. > > > > > > > > On Tue, Jul 28, 2009 at 9:25 AM, bdaniel7 <[email protected]> > > > wrote: > > > > > > > > > Hello, i have the following setup: > > > > > > > > > [ActiveRecord(Lazy = true, DynamicInsert = true, DynamicUpdate > = > > > true, > > > > > > > SelectBeforeUpdate = true)] > > > > > > > public class Incident : ActiveRecordValidationBase<Incident> > > > > > > > { > > > > > > > Address address; > > > > > > > > > [BelongsTo(Cascade = CascadeEnum.SaveUpdate, Update=false)] > > > > > > > [ValidateNonEmpty(RunWhen = RunWhen.Insert)] > > > > > > > public virtual Address Address > > > > > > > { > > > > > > > get { return address; } > > > > > > > set { address = value; } > > > > > > > } > > > > > > > > > //... other props > > > > > > > } > > > > > > > > > [ActiveRecord( Lazy=true, DynamicInsert=true, > DynamicUpdate=true, > > > > > > > SelectBeforeUpdate=true )] > > > > > > > public class Address : ActiveRecordValidationBase<Address> > > > > > > > { > > > > > > > // all properties are required: street, street nr, city, > > > postcode > > > > > > > [Property] > > > > > > > [ValidateNonEmpty] > > > > > > > public virtual string Street > > > > > > > { > > > > > > > get { return street; } > > > > > > > set { street = value; } > > > > > > > } > > > > > > > } > > > > > > > > > [Test] > > > > > > > public void Validate_Incident() > > > > > > > { > > > > > > > Incident i = new Incident(); > > > > > > > i.Address = new Address(); > > > > > > > > > CachedValidationRegistry registry = new > > > > > CachedValidationRegistry(); > > > > > > > ValidatorRunner runner = new ValidatorRunner( registry > ); > > > > > > > > > bool valid = runner.IsValid( i ); > > > > > > > Assert.That(valid, Is.False); > > > > > > > } > > > > > > > > > The test fails, meaning that the incident is considered valid, > even > > > > > > > though the address (or other props) are not filled in. > > > > > > > The validation is not performed in the controller either, in a > code > > > > > > > like this: > > > > > > > > > public void Save( [DataBind( "incident", Validate=true )] > Incident > > > > > > > incident ) > > > > > > > { > > > > > > > ... > > > > > > > } > > > > > > > > > Am i doing something wrong? Is there a bug? This issue is > driving > > > me > > > > > > > crazy... > > > > > > > > > Dan > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Castle Project Users" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/castle-project-users?hl=en -~----------~----~----~----~------~----~------~--~---
