Я пытаюсь связать только подмножество свойств класса из тела запроса API, я не уверен, как этого добиться. Если бы я мог связываться с базовым классом только с теми свойствами, которые я хочу принять в качестве входных данных, то приведу его к дочернему классу с дополнительными свойствами, что решило бы мою проблему, но без сериализации / десериализации это не вариант (т.е. не может быть приведен из база для ребенка). Пример класса, я хочу разрешить привязку имени только из [FromBody]

public class project {
     public string id { get; set; }
     public string name { get; set; }
}

Я мог бы использовать личный сеттер на id, это ответ? Я обнаружил, что когда я сам устанавливаю id в другом месте приложения, я получаю недоступный метод доступа. Спасибо.

0
Chris_au 16 Апр 2019 в 02:55

2 ответа

Лучший ответ

ИМХО, вам следует создать новый DTO для модели, которую вы хотите связать, применяя Принцип единой ответственности, а также лучше для поддержания целей. Если вы начнете наследовать от базового класса, позже вы столкнетесь с огромной проблемой, если вам нужно будет изменить контракт этого класса, например, удалить ненужные свойства, которые могут повлиять на ваши подклассы.

Теперь вы можете создавать

class ProjectWithOnlyName
{
    public string name{get;set;}
}

И передать этот экземпляр в качестве параметра вашего контроллера

public void MyControllerMethod([FromBody] ProjectWithOnlyName dto)
{
    ....
}

Я бы предложил DTO для каждого действия, которое вы делаете.

Для обновления

class ProjectWithOnlyNameForUpdateDto
{
    public string name{get;set;}
}

[HttpPut]
public void CreateMethod([FromBody] ProjectWithOnlyNameForUpdateDto dto)
{
    ....
}

Для создания

class ProjectWithOnlyNameForCreateDto
{
    public string name{get;set;}
}

[HttpPost]
public void CreateMethod([FromBody] ProjectWithOnlyNameForCreateDto dto)
{
    ....
}

Надеюсь это поможет

1
Zinov 16 Апр 2019 в 01:25

Вы можете использовать конвертер типов, как описано здесь

0
Milan Raval 16 Апр 2019 в 01:04