2016-06-08 54 views
0

我知道它可以自动完成;将QueryString解析为强类型对象

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

public ActionResult Index(Query q) 
{ 
} 

一些查询字符串/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.Paramsrequest.QueryString不同。

+0

这正是我所期待的。谢谢! – pwas

相关问题