2016-06-08 4 views
0

Я знаю, что это можно сделать автоматически;Parse QueryString в строго типизированный объект

class Query 
{ 
    public int?[] Id { get; set; } 
} 

public ActionResult Index(Query q) 
{ 
} 

Некоторые QueryString /index?id=10&id=11

Он работает flawlessy.

Но в каком-то случае у меня есть только запросить в наличии:

Reqest.RawUrl 

можно использовать встроенный в разборе для создания объекта запроса?

Query q = SomeMagicStuff<Query>(Request.RawUrl); 

ответ

3

Да, это возможно. Если вы используете MVC вы можете использовать MVC DefaultModelBinder я написать функцию для этого случая:

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); 
    } 
} 

Обратите внимание, что есть 2 способа. Они отличаются только request.Params и request.QueryString.

+0

Это именно то, что я искал. Благодаря! – pwas

Смежные вопросы