内容简介:翻译自: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
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Golang Echo数据绑定中time.Time类型绑定失败
- 如何在Symfony的表单中添加一个未绑定字段,否则绑定到一个实体?
- js双向绑定
- 延迟静态绑定——static
- 绑定自定义事件
- angular组件双向绑定
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
算法竞赛入门经典
刘汝佳 / 清华大学出版社 / 2009-11 / 24.00元
《算法竞赛入门经典》是一本算法竞赛的入门教材,把C/C++语言、算法和解题有机地结合在了一起,淡化理论,注重学习方法和实践技巧。全书内容分为11章,包括程序设计入门、循环结构程序设计、数组和字符串、函数和递归、基础题目选解、数据结构基础、暴力求解法、高效算法设计、动态规划初步、数学概念与方法、图论模型与算法,覆盖了算法竞赛入门所需的主要知识点,并附有大量习题。书中的代码规范、简洁、易懂,不仅能帮助......一起来看看 《算法竞赛入门经典》 这本书的介绍吧!