asp.net – C#Web API模型绑定提供程序应如何工作?

栏目: ASP.NET · 发布时间: 7年前

内容简介:翻译自:https://stackoverflow.com/questions/24470039/how-should-a-c-sharp-web-api-model-binder-provider-work

我有以下内容:

>请求网址:’端点/ 1,2,3?q = foo’

>请求绑定的操作:

公共对象栏([ModelBinder]列表<T> ID,[FromUri]字符串q)

我想将“1,2,3”片段映射到“ids”参数,因此我根据 this link 创建了一个ModelBinderProvider,它应该调用正确的模型绑定器.

public class MyModelBinderProvider: ModelBinderProvider
{
    public override IModelBinder GetBinder(HttpConfiguration configuration, Type modelType)
    {
        IModelBinder modelBinder = null;

        if (modelType.IsGenericType && (modelType.GetGenericTypeDefinition() == typeof(List<>)))
        {
            modelBinder = new ListModelBinder();   
        }

        return modelBinder;
    }
}

我在Global.asax中注册了提供者,如下所示:

GlobalConfiguration.Configuration.Services.Insert(typeof(ModelBinderProvider), 0, new MyModelBinderProvider());

原因是:我创建了这个提供程序,因为我想要,无论T是什么(‘1,2,3’或’一,二,三’),绑定才能工作.

问题:

让我们说T是’int’;每次发送请求时,’modelType’参数总是’int’而不是我所期望的 – ‘List<int>‘,因此请求未得到妥善处理.

奇怪的是:做这样的事情有效,但T是专门的,因此不是我想要的:

var simpleProvider = new SimpleModelBinderProvider(typeof(List<int>), new ListModelBinder());
GlobalConfiguration.Configuration.Services.Insert(typeof(ModelBinderProvider), 0, simpleProvider);

我看不出我做错了什么,为什么’modelType’参数不是预期值?

这是一个非常古老的问题,但我在遗留代码中遇到了类似的问题.

逗号是保留的,应该避免,虽然它们在某些情况下工作,但如果你真的想使用它们……

一旦“1,2,3”是网址的路径部分,我认为这更像是路径问题而不是模型绑定器.假设这个我编写了一个小的RouteHandler来完成这个技巧(请原谅非常简单的“单词到整数”翻译器).

CsvRouteHandler从URL获取id数组,并将其作为整数数组放在RouteData上.如果原始数组包含一个,两个或三个单词,则会将每个值转换为int.

MvcRouteHandler

protected override IHttpHandler GetHttpHandler(System.Web.Routing.RequestContext requestContext)
{
    var idArrayParameter = requestContext.RouteData.Values["idArray"] != null ? requestContext.RouteData.Values["idArray"].ToString() : null;
    if (string.IsNullOrEmpty(idArrayParameter))
    {
        return base.GetHttpHandler(requestContext);
    }

    requestContext.RouteData.Values.Remove("idArray"); // remove the old array from routedata

    // Note: it is horrible and bugged but and you probably have your own translation method :)
    string[] idArray = idArrayParameter.Split(',');
    int[] ids = new int[idArray.Length];

    for(int i = 0; i < idArray.Length; i++)
    {
        if (!int.TryParse(idArray[i], out ids[i]))
        {
            switch (idArray[i])
            {
                case "one":
                    ids[i] = 1;
                    break;
                case "two":
                    ids[i] = 2;
                    break;
                case "three":
                    ids[i] = 3;
                    break;
            }
        }
    }

    requestContext.RouteData.Values.Add("Id", ids);

    return base.GetHttpHandler(requestContext);

}
}

路线配置:

routes.Add(
        name: "Id Array Route",
        item: new Route(
            url: "endpoint/{idArray}",
            defaults: new RouteValueDictionary(new { controller = "Test", action = "Index" }),
            routeHandler: new CsvRouteHandler())
    );

翻译自:https://stackoverflow.com/questions/24470039/how-should-a-c-sharp-web-api-model-binder-provider-work


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

机器学习实战

机器学习实战

Peter Harrington / 李锐、李鹏、曲亚东、王斌 / 人民邮电出版社 / 2013-6 / 69.00元

机器学习是人工智能研究领域中一个极其重要的研究方向,在现今的大数据时代背景下,捕获数据并从中萃取有价值的信息或模式,成为各行业求生存、谋发展的决定性手段,这使得这一过去为分析师和数学家所专属的研究领域越来越为人们所瞩目。 本书第一部分主要介绍机器学习基础,以及如何利用算法进行分类,并逐步介绍了多种经典的监督学习算法,如k近邻算法、朴素贝叶斯算法、Logistic回归算法、支持向量机、AdaB......一起来看看 《机器学习实战》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具