ASP.NET Core自定义模型绑定器仅适用于一个属性

14

我有一个简单的asp.net core控制器模型:

[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; }
}
我试图使用自定义模型绑定器或操作筛选器设置“OrganizationCode”的值,但没有成功。如果您能建议在执行操作之前更新模型的正确方法,我会非常感激。
谢谢。

请提供有关要绑定到OrganizationCode属性的数据来源的更多信息。它是否与其他属性一起发布,但使用不同的名称? - João Pereira
2个回答

15

我将展示一个非常简单的自定义模型绑定器,我刚刚编写并在 .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分钟前学到了这一点,并且发现您的问题(没有有用的答案),因此我尝试提供帮助。这是一个非常基本的模型绑定程序,肯定需要一些改进。我从官方文档页面学习如何编写它。

你休息了吗?那还不足以让它正常工作。 - AymenDaoudi
2
@AymenDaoudi 我非常确定这段代码(即使它不能直接编译)在你了解该主题后会非常有帮助。我从我所工作的项目之一中复制了这段代码(当然是完全由我编写的)。 - Mohammed Noureldin

4
你在操作参数上所使用的 [FromBody] 属性,意味着你已经指定模型绑定的默认行为使用格式化程序。因此你自定义的模型绑定器不起作用了。
并且 [FromBody] 是读取请求内容(请求体)。所以你无法从动作过滤器中获取请求体,因为请求体是一个不可重置的流,所以应该只读取一次(我假设你正在尝试从动作过滤器中读取请求体)。
我的建议是使用你自定义的模型绑定器并删除 FromBody 属性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接