I'm currently using ServiceStack 6.10 and in the ServiceStack API Explorer I have the following Form for one of my services GET requests.
On submit a GET request is created with a querystring including null parameter values (without the equals) e.g. ?include&id&uid. These are optional parameters so valid GET requests might be ?include&id&uid=fa70b09146431b19 or ?include&id=77&uid.
The following PublicationGet DTO class fails to bind to the request. Several other requests follow the same IUIdModel interface and all fail to bind with the same error.
[Route("/publications/{Id:int}", "GET")]
[Route("/publications/{UId:string}", "GET")]
[Description("Get details of a Publication if accessible for current user session.")]
public class PublicationGet : IUIdModel, IReturn<PublicationDetails>
{
[ApiMember(Name = "Id", Description = "Publication Id", DataType = "int", Route = "/publications/{Id:int}")]
public int Id { get; set; }
[ApiMember(Name = "UId", Description = "Publication UId", DataType = "string", Route = "/publications/{UId:string}")]
public string UId { get; set; }
[ApiMember(Name = "Include", Description = "Comma separated list of properties on response to populate from id values.", DataType = "string", ParameterType = "body", IsRequired = false, IsOptional = true)]
public string Include { get; set; }
}
When the DTO is deserialized from the request there is an extra null key in the IRequest.QueryString NameValueCollection which contains a comma separated list of the null parameters i.e. id,include and this causes an exception;
Unable to bind to request, SerializationException 'id,include' is an Invalid value for ''
This is thrown from the StringMapTypeDeserializer.PopulateFromKeyValue method since an inner exception is thrown by the call to propertySetterMap.TryGetValue(propertyName, out propertySerializerEntry) as here propertyName is the null key from the NameValueCollection.
I can't modify IRequest.QueryString in a pre-request filter as it's read only. I haven't found anything in the JSON Format configuration that might change the way the deserialization occurs.
Using the JSON view of the API Explorer works making the GET request because the parameter values for those inputs are omitted.
Removing the null parameters from the querystring will avoid the exception or making them empty instead of null (with an equals) i.e. ?include=&id=&uid=.
Is there any way to modify the API Explorer to avoid the binding exception so the Form submit will work?

Your routes are invalid, which don't support specifying type constraints on the route, instead you would need to use Custom Request Rules to support multiple routes on the same variable route path, e.g:
Also this isn't issue with the latest version of ServiceStack which doesn't send empty variables on the querystring: