I know it can be done automatically;
class Query
{
public int?[] Id { get; set; }
}
public ActionResult Index(Query q)
{
}
Some QueryString /index?id=10&id=11
It works flawlessy.
But in some scenario I have only request available:
Reqest.RawUrl
It is possible to use built-in parsing to create query object?
Query q = SomeMagicStuff<Query>(Request.RawUrl);
Yes it is possible. If you using MVC you can use MVC DefaultModelBinder
i write a function for this case:
public class MyModelBinder<T>
{
private ModelBindingContext modelBindingContext = new ModelBindingContext();
/// <summary>
/// Method to get model from QueryString
/// </summary>
/// <param name="request">HttpRequest</param>
/// <returns>T model</returns>
public static T GetModelFromQueryString(HttpRequest request)
{
modelBindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(null, typeof(T));
modelBindingContext.ValueProvider = new NameValueCollectionValueProvider(request.QueryString, System.Globalization.CultureInfo.InvariantCulture);
IModelBinder mb = new DefaultModelBinder();
return (T)mb.BindModel(new ControllerContext(), modelBindingContext);
}
/// <summary>
/// Method to get model from FormColletion
/// </summary>
/// <param name="request">HttpRequest</param>
/// <returns>T model</returns>
public static T GetModelFromFormColletion(HttpRequest request)
{
modelBindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(null, typeof(T));
modelBindingContext.ValueProvider = new NameValueCollectionValueProvider(request.Params, System.Globalization.CultureInfo.InvariantCulture);
IModelBinder mb = new DefaultModelBinder();
return (T)mb.BindModel(new ControllerContext(), modelBindingContext);
}
}
Note that there is 2 methods. They are differ only with request.Params
and request.QueryString
.
That is exactly what I was looking for. Thanks!