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
-~----------~----~----~----~------~----~------~--~---

Reply via email to