Добавление/редактирование данных в клиент-серверном приложении 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; }
}