asp.net核心自定义模型绑定器只适用于一个属性

时间:2017-07-02 12:41:58

标签: asp.net-core asp.net-core-mvc model-binding custom-model-binder

我的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; }
}

我试图设定&#34; OrganisationCode&#34;的价值。使用自定义模式绑定器或操作过滤器,但没有成功。 如果你在执行动作之前建议更新模型的正确方法,我会很蠢。

感谢。

2 个答案:

答案 0 :(得分:7)

我将在这里向您展示一个非常简单的自定义模型绑定器,我刚刚编写(并在.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
}

它的作用是:它接收一些文本,例如&#34; aaa,bbb,ccc&#34;,并将其转换为数组,并将其返回到ViewModel。

我希望有所帮助。

免责声明:我不是模型粘合剂写作的专家,我在15分钟前就已经知道了,我找到了你的问题(没有有用的答案),所以我试着帮忙。这是一个非常基本的模型粘合剂,肯定需要一些改进。我学会了如何从official documentation页面编写它。

答案 1 :(得分:3)

您在action参数上使用的[FromBody]属性。表示您指示模型绑定的默认行为,而不是使用格式化程序。这就是您的自定义Model Binder不起作用的原因。

[FromBody]正在阅读内容(请求正文)。因此,您无法从Action Filter中获取请求正文,因为请求正文是一个不可重绕的流,所以它假设只读一次(我假设您正在尝试读取请求来自Action Filter的主体。)

我的建议是使用自定义模型绑定器并删除FromBody属性。