2016-06-08 103 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