Warm tip: This article is reproduced from serverfault.com, please click

c#-将QueryString解析为强类型对象

(c# - Parse QueryString into strongly typed object)

发布于 2016-06-08 13:13:12

我知道这可以自动完成;

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

public ActionResult Index(Query q)
{
}

一些查询字符串 /index?id=10&id=11

它完美无瑕。

但是在某些情况下,我只有可用的请求:

Reqest.RawUrl

是否可以使用内置的解析来创建查询对象?

Query q = SomeMagicStuff<Query>(Request.RawUrl);
Questioner
pwas
Viewed
0
teo van kot 2016-06-08 21:24:25

是的,有可能。如果你使用MVC,则可以使用MVCDefaultModelBinder为这种情况编写函数:

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