two issues here: 1. non-nullable list break if empty values exists. 2. nulluable list ignores null values.
my take is: 1. should be fixed. the List<double> should contain 2 values in the demo I'll be happy to get a patch 2. in the web lingua, a parameter without value is considered missing. I think that lists of ref types should also ignore missing values. On Thu, Jan 29, 2009 at 6:09 PM, Mike Nichols <[email protected]>wrote: > > I have found why this behaviour exists but am not sure whether this is > by design or is a bug. When DefaultConverter tries to convert a > Nullable type, it doesn't treat 'null' as a valid value and so simply > returns 'null'. However a generic list requires the NULL to be cast to > teh Nullable type . The fix is simple, simple have ACtivator create an > instance of the nullable type passing NULL as the value. > > But I am not sure whether this patch would be accepted or not. To me > it seems logical that a nullable list would have null values, but I > could see the other side too. > > Now if we are just talking about a List<double> then it seems like it > should add as many items as it can ... in the example below add 2 > items. However right now it simply doesn't add any items because of > the exception thrown on the list...again, I am not sure whether to > roll my own or submit a patch. > > Any monorail devs have a take on this? > > On Jan 29, 12:19 am, Mike Nichols <[email protected]> wrote: > > I hate to post about databinder stuff, but this seems odd. > > What is the expected behaviour binding to a params dictionary like: > > params["obj.SomeList[0]"]="123" > > params["obj.SomeList[1]"]="456" > > params["obj.SomeList[2]"]="" > > params["obj.SomeList[3]"]="" > > > > I swear DataBinder used to add 2 items to obj.SomeList (List<double?>) > > but I just moved to IIS7/server 2008 and now it doesn't add any values > > at all. However if 'null' is the value instead of empty strings then > > it works just fine. > > > > I am using today's trunk. > > > > Here are tests demonstrating... > > The first test here PASSES, but the other two FAIL...note that NULL > > values allow DataBinder to create and hydrate the list as expected. > > Has anyone else come against this?: > > > > public class when_binding_indexed_properties_with_null_list_itemas : > > context_spec > > { > > private ControllerBindingLIst sut; > > private StubMonoRailServices services; > > private IControllerContext controllerContext; > > private StubEngineContext engineContext; > > > > public override void establish_context() > > { > > services = new StubMonoRailServices(); > > sut = new ControllerBindingLIst(); > > controllerContext = services.ControllerContextFactory > > .Create("", "home", "MyAction", > > services.ControllerDescriptorProvider.BuildDescriptor(sut)); > > > > engineContext = new StubEngineContext(); > > engineContext.Request.Params.Add("entity.List[0]", > "123"); > > engineContext.Request.Params.Add("entity.List[1]", > "456"); > > engineContext.Request.Params.Add("entity.List[2]", null); > // > > databinder recognizes this > > engineContext.Request.Params.Add("entity.List[3]", > null);// > > databinder recognizes this > > > > } > > > > public override void because() > > { > > //given > > sut.Process(engineContext, controllerContext); > > } > > [Observation] > > public void should_not_be_null() > > { > > Assert.NotNull(sut.list); > > } > > [Observation] > > public void should_have_two_list_items() > > { > > Assert.Equal(2, sut.list.Count); //passes > > } > > > > } > > > > public class when_binding_indexed_properties_with_empty_list_items : > > context_spec > > { > > private ControllerBindingLIst sut; > > private StubMonoRailServices services; > > private IControllerContext controllerContext; > > private StubEngineContext engineContext; > > > > public override void establish_context() > > { > > services = new StubMonoRailServices(); > > sut = new ControllerBindingLIst(); > > controllerContext = services.ControllerContextFactory > > .Create("", "home", "MyAction", > > services.ControllerDescriptorProvider.BuildDescriptor(sut)); > > > > engineContext = new StubEngineContext(); > > engineContext.Request.Params.Add("entity.List[0]", > "123"); > > engineContext.Request.Params.Add("entity.List[1]", > "456"); > > engineContext.Request.Params.Add("entity.List[2]", > "");//databinder > > consequently disregards all values > > engineContext.Request.Params.Add("entity.List[3]", ""); > > > > } > > > > public override void because() > > { > > //given > > sut.Process(engineContext,controllerContext); > > > > } > > [Observation] > > public void should_not_be_null() > > { > > Assert.NotNull(sut.list); > > } > > [Observation] > > public void should_have_two_list_items() > > { > > Assert.Equal(2,sut.list.Count); //FAILS, saying zero > items are in > > the list > > } > > > > } > > > > public class when_binding_repeated_properties_on_sdc : context_spec > > { > > private ControllerBindingLIst sut; > > private StubMonoRailServices services; > > private IControllerContext controllerContext; > > private StubEngineContext engineContext; > > > > public override void establish_context() > > { > > services = new StubMonoRailServices(); > > sut = new ControllerBindingLIst(); > > controllerContext = services.ControllerContextFactory > > .Create("", "home", "MyAction", > > services.ControllerDescriptorProvider.BuildDescriptor(sut)); > > > > engineContext = new StubEngineContext(); > > engineContext.Request.Params.Add("entity.List", "123"); > > engineContext.Request.Params.Add("entity.List", "456"); > > engineContext.Request.Params.Add("entity.List", ""); > > engineContext.Request.Params.Add("entity.List", ""); > > > > } > > > > public override void because() > > { > > //given > > sut.Process(engineContext, controllerContext); > > > > } > > [Observation] > > public void should_not_be_null() > > { > > Assert.NotNull(sut.list); > > } > > [Observation] > > public void should_have_two_list_items() > > { > > Assert.Equal(2, sut.list.Count); //same thing...fails > saying zero > > items are in list > > } > > > > } > > > > //ENTITIES USED > > public class ObjWithList > > { > > List<double?> list=new List<double?>(); > > > > public List<double?> List > > { > > get { return list; } > > set { list = value; } > > } > > > > } > > > > public class ControllerBindingLIst:SmartDispatcherController > > { > > public List<double?> list; > > > > public void MyAction([DataBind("entity")] ObjWithList entity) > > { > > this.list = entity.List; > > } > > > > } > > > -- Ken Egozi. http://www.kenegozi.com/blog http://www.delver.com http://www.musicglue.com http://www.castleproject.org http://www.gotfriends.co.il --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
