связыватель пользовательской модели ядра asp.net только для одного свойства

У меня есть простая модель для моего основного контроллера 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; }
}

Я пытаюсь установить значение «OrganisationCode» с помощью привязки настраиваемого режима или фильтра действий, но безуспешно. Буду признателен, если вы посоветуете, как правильно обновить модель перед выполнением действия.

Спасибо.


person Alex    schedule 02.07.2017    source источник
comment
Предоставьте дополнительную информацию о происхождении данных, которые вы хотите привязать к свойству OrganisationCode. Он размещен вместе с другими объектами недвижимости под другим именем?   -  person João Pereira    schedule 02.07.2017


Ответы (2)


Я покажу вам очень простой связыватель пользовательских моделей, который я только что написал (и протестировал в .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 минут назад и нашел ваш вопрос (без полезного ответа), поэтому попытался помочь. Это очень простая привязка моделей, безусловно, требуются некоторые улучшения. Я научился писать это из страница официальной документации.

person Mohammed Noureldin    schedule 18.04.2018
comment
Вы отдохнули, этого недостаточно, чтобы заставить его работать - person AymenDaoudi; 13.05.2020
comment
@AymenDaoudi Я почти уверен, что этот код (даже если он не компилируется, как это в буквальном смысле слова) может быть очень полезным после того, как немного почитал по этой теме. Я скопировал код из одного из проектов, над которым работал (конечно, полностью написанного мной). - person Mohammed Noureldin; 13.05.2020

Атрибут [FromBody], который вы используете для параметра действия. означает, что вы указываете поведение привязки модели по умолчанию, чтобы вместо этого использовались средства форматирования. Вот почему ваш пользовательский связыватель моделей не работает.

А [FromBody] читает содержимое (тело запроса). Таким образом, вы не получите тело запроса из своего фильтра действий, поскольку тело запроса является потоком без возможности перемотки, поэтому предполагается, что он будет прочитан только один раз (я предполагаю, что вы пытаетесь прочитать тело запроса из фильтра действий ).

Я предлагаю использовать вашу настраиваемую подшивку модели и удалить атрибут FromBody.

person Laksmono    schedule 24.08.2017