如何在Web Api 2中自定义FromUri收到的解析?

时间:2017-03-02 13:32:00

标签: c# asp.net parsing asp.net-web-api asp.net-web-api2

当webservice尝试从通过[FromUri]参数接收的复杂类型(类)进行解析时,我想自定义绑定某些属性的方式。

控制器方法

module.exports = function(grunt) {
 // Project configuration.
 grunt.initConfig({
   pkg: grunt.file.readJSON('package.json'),
    connect: {
     uses_defaults: {}
   },
    sass: {
     dev: {
       options: { sourceMap: true },
       files: { 'sites/all/themes/uj/css/uj.styles.css' : 'sites/all/themes/uj/sass/uj.styles.scss' }     
    }
   },
   watch: {
    css: {
      files: 'sites/all/themes/uj/sass/**/*.scss',
      tasks: [ 'sass:dev' ]
      options: { livereload: true }
 }
}



 });
 // Load Grunt plugins
 grunt.loadNpmTasks('');
 // Default task(s).
 grunt.registerTask('default', []);



// Load Grunt plugins
grunt.loadNpmTasks('grunt-contrib-connect');
grunt.loadNpmTasks('grunt-sass');
grunt.loadNpmTasks('grunt-contrib-watch');


};

[HttpGet]
[Route("Test")]
public IHttpActionResult ComplexPropertiesTest([FromUri] MyComplexPropertiesClass parameters)
需要使用 public class MyComplexPropertiesClass { public DateTime TestTime { get; set; } public IEnumerable<int> TestIntEnumeration { get; set; } public int SimpleInt { get; set; } public string SimpleString { get; set; } // More properties... } 日期格式从字符串中解析

TestTime,并且只需要存储时间部分yyyyMMddTHHmmss

HHmmss可以作为TestEnumeration之类的字符串接收,并且必须存储为5,20,50,100,9

网址示例:

IEnumerable[int]

我在http://www.vickram.me/custom-datetime-model-binding-in-asp-net-web-api/中尝试了http://www.example.com/test?TestTime=20170303T091500&TestEnumeration=5,20,50,100,9. 方法,但只有在我将控制器方法更改为以下内容时才有效:

HttpParameterBinding

但这不是一个好的解决方案,因为我需要修改控制器以手动将每个参数分配给新的MyComplexPropertiesClass实例的属性。

另外,我在http://www.strathweb.com/2013/04/asp-net-web-api-parameter-binding-part-1-understanding-binding-from-uri/

中尝试了public IHttpActionResult ComplexPropertiesTest ([ModelBinder(typeof(CommaSeparatedIntegerCollectionModelBinder))] IEnumerable<int> TestIntEnumeration, …all the other parameters…)` 方法
CommaDelimitedCollectionModelBinder

我在bindingContext.ModelName中收到internal class CustomModelBinder : IModelBinder { public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) { ValueProviderResult val = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); if (val?.AttemptedValue == null) { return false; } } } ,但从逻辑上讲,parameters没有ValueProvider。我可以尝试获取MyComplexPropertiesClass的值,但是我需要手动解析每个属性并使用反射将值分配给actionContext.Request.RequestUri.Query的新实例。我很乐意手动解析我想要的那些,其余部分利用默认的Web Api 2绑定过程。

请问你能帮帮我吗?

1 个答案:

答案 0 :(得分:0)

以下是与DateTime相似的案例:

Complement [FromUri] serialization with APIController

缺点是应用于每个DateTime属性。您无法选择要使用此行为的属性。它也没有用TestEnumeration解决问题。