asp.net – C#Web API模型绑定提供程序应如何工作?
我有以下内容:
>请求网址:’端点/ 1,2,3?q = foo’ 我想将“1,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),new MyModelBinderProvider()); 原因是:我创建了这个提供程序,因为我想要,无论T是什么(‘1,3’或’一,二,三’),绑定才能工作. 问题: 奇怪的是:做这样的事情有效,但T是专门的,因此不是我想要的: var simpleProvider = new SimpleModelBinderProvider(typeof(List<int>),new ListModelBinder()); GlobalConfiguration.Configuration.Services.Insert(typeof(ModelBinderProvider),simpleProvider); 我看不出我做错了什么,为什么’modelType’参数不是预期值? 解决方法
这是一个非常古老的问题,但我在遗留代码中遇到了类似的问题.
逗号是保留的,应该避免,虽然它们在某些情况下工作,但如果你真的想使用它们…… 一旦“1,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()) ); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 在ASP.Net网站上实现自定义错误页面
- asp.net-mvc – ASP.NET MVC单元测试 – 会话
- 在经典ASP中对集合进行排序
- asp.net – 将div固定在html中的某一点
- asp.net-mvc – asp.net mvc wiki
- ASP.NET – 内联与代码隐藏
- asp.net-web-api – 仅允许某些域访问web api
- ASP.net:我可以在bin文件夹中拥有2个不同版本的相同dll /
- Aspect-Oriented Programming : Aspect-Oriented Programmi
- asp.net-mvc – ApplicationDbContext – 它在项目中的位置
- ASP.net C#:如何使用File.ReadLines(fileName).
- ASP.NET MVC 3 – 如何以有效的方式限制区域?
- asp.net – 链接到Microsoft编码标准/最佳实践文
- ASP.NET Web Form Project行动平台直立与横放自动
- ASP.NET MVC表单和双字段
- asp.net – 模拟无法正常工作 – 网络共享
- asp.net-web-api – Asp.Net核心WebAPI CORS无效
- asp.net-mvc – ASP.NET MVC提醒我旧的经典ASP意
- 实体框架 – ASP.NET Identity Model First因重命
- asp.net-mvc – 通知面板类似于stackoverflow的