我的 asp.net 核心控制器有一个简单的模型:
[HttpPost]
public async Task<DefaultResponse> AddCourse([FromBody]CourseDto dto)
{
var response = await _courseService.AddCourse(dto);
return response;
}
我的模型是:
public class CourseDto
{
public int Id { get; set; }
public string Name { get; set; }
public string Genre { get; set; }
public string Duration { get; set; }
public string Level { get; set; }
public string AgeRange { get; set; }
public string Notes { get; set; }
public bool Active { get; set; }
public string OrganisationCode { get; set; }
}
我正在尝试使用自定义模式绑定器或操作过滤器设置"组织代码"的值,但没有成功。 如果您在执行操作之前建议更新模型的正确方法,我将不高兴。
谢谢。
我将在这里向您展示我刚刚编写的一个非常简单的自定义模型绑定器(并在.Net Core 2.0中进行了测试(:
我的模型活页夹:
public class CustomModelBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
var value = valueProviderResult.FirstValue; // get the value as string
var model = value.Split(",");
bindingContext.Result = ModelBindingResult.Success(model);
return Task.CompletedTask;
}
}
我的模型(请注意,只有一个属性具有我的自定义模型绑定器注释(:
public class CreatePostViewModel
{
[Display(Name = nameof(ContentText))]
[MinLength(10, ErrorMessage = ValidationErrors.MinLength)]
public string ContentText { get; set; }
[BindProperty(BinderType = typeof(CustomModelBinder))]
public IEnumerable<string> Categories { get; set; } // <<<<<< THIS IS WHAT YOU ARE INTERESTER IN
#region View Data
public string PageTitle { get; set; }
public string TitlePlaceHolder { get; set; }
#endregion
}
它的作用是:它接收一些文本,如"aaa,bbb,ccc",并将其转换为数组,并将其返回到ViewModel。
我希望这有所帮助。
免责声明:我不是模型活页夹写作的专家,我在 15 分钟前了解到这一点,我发现了您的问题(没有有用的答案(,所以我试图提供帮助。这是一个非常基本的模型绑定器,肯定需要一些改进。我从官方文档页面学会了如何编写它。
对操作参数使用的 [FromBody] 属性。 表示指示模型绑定的默认行为改用格式化程序。这就是自定义模型绑定器不起作用的原因。
而 [FromBody] 正在读取内容(请求正文(。因此,您不会从操作筛选器获取请求正文,因为请求正文是不可倒带的流,因此它假设只读取一次(我假设您正在尝试从操作筛选器读取请求正文(。
我的建议是使用您的自定义模型绑定器并删除 FromBody 属性。