当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实例的属性。
中尝试了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绑定过程。
请问你能帮帮我吗?
答案 0 :(得分:0)
以下是与DateTime相似的案例:
Complement [FromUri] serialization with APIController
缺点是应用于每个DateTime属性。您无法选择要使用此行为的属性。它也没有用TestEnumeration
解决问题。