Добавление/редактирование данных в клиент-серверном приложении C#

хотелось бы узнать как реализовать добавление/редактирование данных в клиент-серверном приложении. У меня есть следующее:

Код XAML Для вывода клиентов:

 <Grid.RowDefinitions>
            <RowDefinition Height="100"/>
            <RowDefinition Height="100"/>
            <RowDefinition />
        </Grid.RowDefinitions>

        <WrapPanel VerticalAlignment="Center" >
            <TextBox x:Name="txtSearchById" Text="Поиск по наименованию" Width="200" Height="35" Margin="50 0 30 0" VerticalAlignment="Center" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" FontSize="15" Foreground="Brown"/>
            <TextBox x:Name="txtSearchByName" Text="Поиск по адресу" Width="200" Height="35" Margin="30 0" VerticalAlignment="Center" VerticalContentAlignment="Center" HorizontalContentAlignment="Center"  FontSize="15" Foreground="Brown"/>
            <TextBox x:Name="txtSearchByNamerg" Text="Поиск по номеру телефона" Width="200" Height="35" Margin="30 0 30 0" VerticalAlignment="Center" VerticalContentAlignment="Center" HorizontalContentAlignment="Center"  FontSize="15" Foreground="Brown"/>
        </WrapPanel>

        <WrapPanel Grid.Row="1" VerticalAlignment="Center">
            <TextBlock Text="Сортировать по:" Margin="118 0 20 0" FontSize="16" VerticalAlignment="Center"/>
            <ComboBox ItemsSource="{Binding Sort}" Width="200" Height="35" Margin="30 0" VerticalAlignment="Center" VerticalContentAlignment="Center" FontSize="15" Foreground="Brown"/>
            <Button Command="{Binding AddClient}" Content="Добавить клиента" Width="170" Height="35" VerticalAlignment="Center" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" FontSize="18"/>
        </WrapPanel>

        <ListBox Grid.Row="2" ItemsSource="{Binding Clients}" SelectedItem="{Binding SelectedClient}" HorizontalContentAlignment="Stretch" SelectionMode="Extended">
            <ListBox.ItemTemplate>
                <DataTemplate >
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="auto"/>
                            <ColumnDefinition />
                            <ColumnDefinition/>
                        </Grid.ColumnDefinitions>
                        <StackPanel Grid.Column="1" Orientation="Vertical" HorizontalAlignment="Left">

                            <StackPanel Orientation="Horizontal">
                                <Label Content="Наименование:"/>
                                <Label Content="{Binding TitleClient}"/>
                            </StackPanel>

                            <StackPanel Orientation="Horizontal">
                                <Label Content="Адрес:"/>
                                <Label Content="{Binding Address}"/>
                            </StackPanel>

                            <StackPanel Orientation="Horizontal">
                                <Label Content="Номер телефона:"/>
                                <Label Content="{Binding NumberPhone }"/>
                            </StackPanel>
                        </StackPanel>
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
            <ListBox.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="Редактировать" Command="{Binding EditClient}"/>
                </ContextMenu>
            </ListBox.ContextMenu>
        </ListBox>

Код XAML Для добавления/редактирования :

<StackPanel >
                <Label Content="Добавить нового клиента:" FontSize="22" HorizontalAlignment="Center" Margin="50 50 0 0" FontWeight="Bold"/>

            <WrapPanel HorizontalAlignment="Center" Margin="0 30 30 0">
                <Label Content="Наименование:" FontSize="20" HorizontalAlignment="Center" Margin="0 0 20 0"/>
                <TextBox Text="{Binding TitleClient}" Width="200" FontSize="20"/>
            </WrapPanel>

            <WrapPanel HorizontalAlignment="Center" Margin="0 30 -55 0" >
                <Label Content="Адрес:" FontSize="20" HorizontalAlignment="Center" Margin="0 0 20 0"/>
                <TextBox Text="{Binding Address}" Width="200" FontSize="20"/>
            </WrapPanel>

                <WrapPanel HorizontalAlignment="Center" Margin="0 30 45 0">
                    <Label Content="Номер телефона:" FontSize="20" HorizontalAlignment="Center" Margin="0 0 20 0"/>
                <TextBox Text="{Binding NumberPhone}" Width="200" FontSize="20"/>
                </WrapPanel>
            </StackPanel>
        <Button Command="{Binding AddClient}" Margin="195 0 0 30" Content="Добавить клиента" Width="170" Height="35"  VerticalContentAlignment="Center"  FontSize="18" VerticalAlignment="Bottom" HorizontalAlignment="Left" />
        <Button Command="{Binding SaveClient}" Margin="0 0 195 30" Content="Сохранить клиента" Width="170" Height="35"  VerticalContentAlignment="Center"  FontSize="18" VerticalAlignment="Bottom" HorizontalAlignment="Right" />

View Model для вывода списка клиентов:

public class ClientListViewModel : Notify
    {
        private ClientApi _selectedClient;
        public ClientApi SelectedClient
        {
            get => _selectedClient; 
            set
            {
                _selectedClient = value;
                SignalChanged();
            }
        }

        public CustomCommand EditClient { get; set; }
        public CustomCommand AddClient { get; set; }

        public List<ClientApi> Clients { get; set; }

        public ClientListViewModel()
        {

            ClientsList();

            AddClient = new CustomCommand(() =>
            {
                AddClientPage addClient = new AddClientPage();
                addClient.ShowDialog();
            });

            EditClient = new CustomCommand(() =>
            {
                if (SelectedClient == null)
                    return;
                AddClientPage edit = new AddClientPage();
                edit.ShowDialog();
            });
        }

        public async Task ClientsList()
        {
            var result = await Api.GetListAsync<ClientApi[]>("Client");
            Clients = new List<ClientApi>(result);
            SignalChanged("Clients");
        }
        
        
    }

Класс API:

class Api
    {
        static HttpClient client = new HttpClient();
        static string server = "http://localhost:14687/api/";
        static JsonSerializerOptions jsonOptions = new JsonSerializerOptions
        {
            PropertyNameCaseInsensitive = true
        };


        public static async Task<T> GetListAsync<T>(string controller)
        {
            var answer = await client.GetAsync(server + controller);
            string answerText = await answer.Content.ReadAsStringAsync();
            var result = (T)JsonSerializer.Deserialize(answerText, typeof(T), jsonOptions);
            return result;
        }

        public static async Task<T> GetAsync<T>(int id, string controller) where T : ModelsApi.ApiBaseType
        {
            var answer = await client.GetAsync(server + controller + $"/{id}");
            if (answer.StatusCode == System.Net.HttpStatusCode.OK)
            {
                string answerText = await answer.Content.ReadAsStringAsync();
                var result = (T)JsonSerializer.Deserialize(answerText, typeof(T), jsonOptions);
                return result;
            }
            else
            {
                return null;
            }
        }

        public static async Task<int> PostAsync<T>(T value, string controller) where T : ModelsApi.ApiBaseType
        {
            var str = JsonSerializer.Serialize(value, typeof(T));
            var answer = await client.PostAsync(server + controller, new StringContent(str, Encoding.UTF8, "application/json"));
            if (answer.StatusCode == System.Net.HttpStatusCode.BadRequest)
                return -1;
            string answerText = await answer.Content.ReadAsStringAsync();
            if (!int.TryParse(answerText, out int result))
                return -1;
            return result;
        }

        public static async Task<bool> PutAsync<T>(T value, string controller) where T : ModelsApi.ApiBaseType
        {
            var str = JsonSerializer.Serialize(value, typeof(T));
            var answer = await client.PutAsync(server + controller + $"/{value.Id}", new StringContent(str, Encoding.UTF8, "application/json"));
            return answer.StatusCode == System.Net.HttpStatusCode.OK;
        }

        public static async Task<bool> DeleteAsync<T>(T value, string controller) where T : ModelsApi.ApiBaseType
        {
            var answer = await client.DeleteAsync(server + controller + $"/{value.Id}");
            return answer.StatusCode == System.Net.HttpStatusCode.OK;
        }
    }

При создании клиента(ввод ручками) через swagger используется Post запрос. Как мне в приложении(не сервер, "WPF") реализовать данную функцию?

Контроллер клиента:

[Route("api/[controller]")]
    [ApiController]
    public class ClientController : ControllerBase
    {

        private readonly warehouseContext db;

        public ClientController(warehouseContext db)
        {
            this.db = db;
        }


        // GET: api/<ClientController>
        [HttpGet]
        public IEnumerable<ClientApi> Get()
        {
            return db.Clients.Select(s => (ClientApi)s);
        }

        // GET api/<ClientController>/5
        [HttpGet("{id}")]
        public async Task<ActionResult<ClientApi>> Get(int id)
        {
            var client = await db.Clients.FindAsync(id);
            if (client == null)
                return NotFound();
            return Ok(client);
        }

        // POST api/<ClientController>
        [HttpPost]
        public async Task<ActionResult<int>> Post([FromBody] ClientApi value)
        {
            var newClient = (Client)value;
            db.Clients.Add(newClient);
            await db.SaveChangesAsync();
            return Ok(newClient.Id);
        }

        // PUT api/<ClientController>/5
        [HttpPut("{id}")]
        public async Task<ActionResult> Put(int id, [FromBody] ClientApi value)
        {
            var oldClient = await db.Clients.FindAsync(id);
            if (oldClient == null)
                return NotFound();
            db.Entry(oldClient).CurrentValues.SetValues(value);
            await db.SaveChangesAsync();
            return Ok();
        }

        // DELETE api/<ClientController>/5
        [HttpDelete("{id}")]
        public async Task<ActionResult> Delete(int id)
        {
            var oldClient = await db.Clients.FindAsync(id);
            if (oldClient == null)
                return NotFound();
            db.Clients.Remove(oldClient);
            await db.SaveChangesAsync();
            return Ok();
        }
    }

dbExtension:


public static explicit operator ClientApi(Client client)
        {
            if (client == null)
                return null;
            return new ClientApi
            {
                Id = client.Id,
                TitleClient = client.TitleClient,
                Address = client.Address,
                NumberPhone = client.NumberPhone
            };
        }

        public static explicit operator Client(ClientApi client)
        {
            if (client == null)
                return null;
            return new Client
            {
                Id = client.Id,
                TitleClient = client.TitleClient,
                Address = client.Address,
                NumberPhone = client.NumberPhone
            };
        }

Свойства клиента:

public int Id { get; set; }
public string TitleClient { get; set; }
public string Address { get; set; }
public string NumberPhone { get; set; }

ClientApi:

 public class ClientApi : ApiBaseType
    {
        public string TitleClient { get; set; }
        public string Address { get; set; }
        public string NumberPhone { get; set; }

    }

Ответы (0 шт):