Как создать список объектов, подключенных к веб-приложению Azure, в другом списке объектов, подключенных к веб-приложениC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как создать список объектов, подключенных к веб-приложению Azure, в другом списке объектов, подключенных к веб-приложени

Сообщение Anonymous »


Извините за запутанный заголовок. Я не знаю, как выразить словами то, что я ищу, но я постараюсь изо всех сил. В настоящее время я создаю приложение, которое заполняет карту введенными пользователем контактами (модели Restroom.cs), при этом каждый контакт имеет собственный список отзывов, введенных пользователем. Все вводится через веб-API, который обращается к моему веб-приложению Azure. Отзывы и пины работают совершенно нормально. Проблема в том, что на каждом пине отображаются одни и те же отзывы. Я понимаю, что мне нужно изолировать какой-то способ убедиться, что каждый вывод имеет свой собственный «список проверки», но я не совсем уверен, как это сделать и с чего начать, поскольку я новичок в программировании с помощью Azure и WebAPI. . Я предполагаю, что мне нужно создать свойство ObservableRangeCollection в Restroom.cs для хранения отзывов, но я не уверен, что делать дальше, и я также беспокоюсь, что некоторые вещи, возможно, придется изменить, поскольку отзывы будут отображаться на другом страница, которая не является главной.

Туалет.cs

с использованием системы; использование System.Collections.Generic; использование System.Data.SqlTypes; используя System.Linq; использование System.Text; использование System.Threading.Tasks; использование SQLite; пространство имен Dook.Shared.Models { общественный класс, туалет { [PrimaryKey, Автоинкремент] [Столбец("Идентификатор")] общественный ИНТ Id {получить; набор; } [Столбец("Имя")] общедоступная строка Имя {get; набор; } [Столбец("Адрес")] общедоступная строка Адрес {get; набор; } [Столбец("Имя пользователя")] публичная строка Имя пользователя {get; набор; } [Столбец("Широта")] общественная двойная широта {get; набор; } [Столбец("Долгота")] общественная двойная долгота {get; набор; } } } Обзор.cs

с использованием системы; использование System.Collections.Generic; используя System.Linq; использование System.Text; использование System.Threading.Tasks; использование SQLite; пространство имен Dook.Shared.Models { Обзор публичного класса { [SQLite.PrimaryKey, SQLite.AutoIncrement] [Столбец("Идентификатор")] общественный ИНТ Id {получить; набор; } [Столбец("Имя пользователя")] публичная строка Имя пользователя {get; набор; } [Колонка("Звезды")] общественные двойные звезды {получить; набор; } [Столбец("Текст")] публичная строка Text {get; набор; } //[Столбец("Теги")] // публичная строка Теги { get; набор; } } } RestroomController.cs

с использованием Microsoft.AspNetCore.Mvc; использование Dook.Shared.Models; использование системы; использование System.Collections.Generic; используя System.Linq; использование System.Threading.Tasks; пространство имен Dook.WebAPI.Controllers { [Апиконтроллер] [Маршрут("api/[контроллер]")] общедоступный класс RestroomController: ControllerBase { общественный статический список Restroom {get; } = новый Список(); [HttpGet] общедоступный IEnumerable Get() { вернуться в туалет; } [HttpGet("{id}")] общественный туалет Get(int id) { return Restroom.FirstOrDefault(c => c.Id == id); } [HttpPost] public void Post([FromBody] Значение туалета) { Туалет.Добавить(значение); } [HttpPut("{id}")] public void Put(int id, значение туалета [FromBody]) { вар туалет = Restroom.FirstOrDefault(c => c.Id == id); если (туалет == ноль) возвращаться; туалет = ценность; } [HttpDelete("{id}")] public void Удалить (int id) { вар туалет = Restroom.FirstOrDefault(c => c.Id == id); если (туалет == ноль) возвращаться; Туалет.Удалить(туалет); } } } Контроллер обзора

с использованием Microsoft.AspNetCore.Mvc; использование Dook.Shared.Models; использование системы; использование System.Collections.Generic; используя System.Linq; использование System.Threading.Tasks; пространство имен Dook.WebAPI.Controllers { [Апиконтроллер] [Маршрут("api/[контроллер]")] общедоступный класс ReviewController: ControllerBase { общедоступный статический список Обзор {get; } = новый список(); [HttpGet] общедоступный IEnumerable Get() { возврат отзыва; } [HttpGet("{id}")] общественный обзор Get(int id) { return Review.FirstOrDefault(c => c.Id == id); } [HttpPost] public void Post([FromBody] Значение обзора) { Обзор.Добавить(значение); } [HttpPut("{id}")] public void Put(int id, значение обзора [FromBody]) { вар обзор = Review.FirstOrDefault(c => c.Id == id); если (обзор == ноль) возвращаться; обзор = ценность; } [HttpDelete("{id}")] public void Удалить (int id) { вар обзор = Review.FirstOrDefault(c => c.Id == id); если (обзор == ноль) возвращаться; Обзор.Удалить(обзор); } } } InternetRestroomService.cs

с использованием Dook.Shared.Models; использование SQLite; использование системы; использование System.Collections.Generic; используя System.Linq; использование System.Text; использование System.Threading.Tasks; использование Newtonsoft.Json; пространство имен Dook.Services { публичный статический класс InternetRestroomService { //статическая строка Baseurl = DeviceInfo.Platform == DevicePlatform.Android? // "http://10.0.2.2:5000" : "http://localhost:5000"; статическая строка BaseUrl = "https://dookwebapp.azurewebsites.net/"; статический клиент HttpClient; статический InternetRestroomService() { клиент = новый HttpClient() { BaseAddress = новый Uri(BaseUrl) }; } статический случайный случайный = новый случайный (); общедоступная статическая асинхронная задача AddPinAsync (имя строки, адрес строки, имя пользователя строки, двойная широта, двойная долгота) { //Проверяем, не является ли идентификатор дубликатом int idNum = random.Next(0, 100000); var randomRestroom = await client.GetStringAsync($"api/Restroom/{idNum}"); Debug.Write(случайный туалет); в то время как (randomResroom != "") { idNum = случайный.Следующий(0, 100000); randomRestroom = ждут client.GetStringAsync($"api/Restroom/{idNum}"); } var туалет = новый туалет { Имя = имя, Адрес = адрес, Имя пользователя = имя пользователя, Широта = широта, Долгота = долгота, Идентификатор = идентификаторNum }; вар json = JsonConvert.SerializeObject(туалет); вар содержимое = новый StringContent(json, Encoding.UTF8, "application/json"); var ответ = ждут client.PostAsync("api/Restroom", content); если(!response.IsSuccessStatusCode) { } } общедоступная статическая асинхронная задача RemovePinAsync (int id) { var ответ = ждут client.DeleteAsync($"api/Restroom/{id}"); если (!response.IsSuccessStatusCode) { } } общедоступная статическая асинхронная задача GetPinAsync() { var json = await client.GetStringAsync("api/Restroom"); вар туалеты = JsonConvert.DeserializeObject(json); возвратные туалеты; } общедоступная статическая асинхронная задача GetSingularPinAsync (int id) { var json = await client.GetStringAsync($"api/Restroom/{id}"); вар туалет = JsonConvert.DeserializeObject(json); возвратный туалет; } } } InternetReviewService.cs

с использованием Dook.Shared.Models; использование Newtonsoft.Json; использование SQLite; использование системы; использование System.Collections.Generic; используя System.Linq; использование System.Text; использование System.Threading.Tasks; пространство имен Dook.Services { общедоступный статический класс InternetReviewService { //статическая строка Baseurl = DeviceInfo.Platform == DevicePlatform.Android? // "http://10.0.2.2:5000" : "http://localhost:5000"; статическая строка BaseUrl = "https://dookwebapp.azurewebsites.net/"; статический клиент HttpClient; статический InternetReviewService() { клиент = новый HttpClient() { BaseAddress = новый Uri(BaseUrl) }; } статический случайный случайный = новый случайный (); общедоступная статическая асинхронная задача AddReviewAsync (строковое имя пользователя, двойные звезды, строковый текст) { //Проверяем, не является ли идентификатор дубликатом int idNum = random.Next(0, 100000); var randomReview = ждут client.GetStringAsync($"api/Restroom/{idNum}"); в то время как (randomReview != "") { idNum = случайный.Следующий(0, 100000); randomReview = ждут client.GetStringAsync($"api/Restroom/{idNum}"); } вар обзор = новый обзор() { Имя пользователя = имя пользователя, Звезды = звезды, Текст = текст, Идентификатор = idNum }; вар json = JsonConvert.SerializeObject(обзор); вар содержимое = новый StringContent(json, Encoding.UTF8, "application/json"); var ответ = ждут client.PostAsync("api/Restroom", content); если (!response.IsSuccessStatusCode) { } } общедоступная статическая асинхронная задача RemoveReviewAsync (int id) { var ответ = ждут client.DeleteAsync($"api/Restroom/{id}"); если (!response.IsSuccessStatusCode) { } } общедоступная статическая асинхронная задача GetReviewAsync() { var json = await client.GetStringAsync("api/Restroom"); вар обзоры = JsonConvert.DeserializeObject(json); обратные отзывы; } } } MainPage.xaml.cs

пространство имен Dook; использование Microsoft.Maui.Controls.Maps; использование Microsoft.Maui.Maps; использование System.Diagnostics; используя Map = Microsoft.Maui.Controls.Maps.Map; использование Dook.ViewModel; использование Dook.Shared.Models; использование Dook.Services; использование CommunityToolkit.Maui.Behaviors; общедоступный частичный класс MainPage: ContentPage { публичная главная страница() { ИнициализироватьКомпонент(); ПереместитьMapLocation(); Популатемапасинк(); } частная пустота GoToLocation_Button (отправитель объекта, EventArgs e) { ПереместитьMapLocation(); } частный асинхронный недействительный RefreshButton_Clicked (отправитель объекта, EventArgs e) { ожидайте PopulateMapAsync(); } частный асинхронный void OnMapClicked (отправитель объекта, MapClickedEventArgs e) { вар vm = (InternetMainViewModel)this.BindingContext; если (vm.AddCommand.CanExecute(e.Location)) дождитесь vm.AddCommand.ExecuteAsync(e.Location); ожидайте PopulateMapAsync(); } частная пустота MoveMapLocation() { MapSpan mapSpan = новый MapSpan(InternetMainViewModel.GetLocation(), 0.01, 0.01); mainmap.MoveToRegion(mapSpan); } частная асинхронная задача PopulateMapAsync() { вар restroomList = ждут InternetRestroomService.GetPinAsync(); foreach (var туалет в списке туалетов) { Пин-пин = новый пин-код { Метка = туалет.Имя, Адрес = туалет.Адрес, Тип = PinType.Generic, Местоположение = новое местоположение (туалет. Широта, туалет. Долгота) }; pin.MarkerClicked += async (s, args) => { args.HideInfoWindow = правда; вар vm = (InternetMainViewModel)this.BindingContext; Debug.Write(туалет.Id); если (vm.SelectedCommand.CanExecute(туалет)) дождитесь vm.SelectedCommand.ExecuteAsync (туалет); //mainmap.Pins.Remove(pin); //если(vm.RemoveCommand.CanExecute(туалет)) // ждем vm.RemoveCommand.ExecuteAsync(уборная); //ждем PopulateMapAsync(); }; mainmap.Pins.Add(pin); } } } RestroomDetailPage.xaml.cs

с использованием Dook.Services; пространство имен Dook.View; [QueryProperty(nameof(RestroomId), nameof(RestroomId))] общедоступный частичный класс RestroomDetailPage: ContentPage { общественная строка RestroomId {получить; набор; } общественный туалетдетаилпаже() { ИнициализироватьКомпонент(); } защищенное переопределение async void OnAppearing() { база.OnAppearing(); int.TryParse(RestroomId, результат var); BindingContext = ждут InternetRestroomService.GetSingularPinAsync(результат); } // частный асинхронный void Button_Clicked(object sender, EventArgs e) // { //ожидаем Shell.Current.GoToAsync(".."); // } } InternetMainViewModel.cs

с использованием системы; использование System.Collections.Generic; используя System.Linq; использование System.Text; использование System.Threading.Tasks; использование Microsoft.Maui.Controls.Maps; использование Microsoft.Maui.Maps; используя Map = Microsoft.Maui.Controls.Maps.Map; использование Dook.Shared.Models; использование Dook.Services; использование MvvmHelpers; использование MvvmHelpers.Commands; использование CommunityToolkit.Maui.Core.Extensions; использование Dook.View; пространство имен Dook.ViewModel { общедоступный класс InternetMainViewModel: BaseViewModel { public ObservableRangeCollection Туалет {get; набор; } общественный AsyncCommand RefreshCommand {get; } общественный AsyncCommand AddCommand {get; } общественный AsyncCommand RemoveCommand {get; } общественный AsyncCommand SelectedCommand {get; } публичная InternetMainViewModel() { Title = "Контроллер карты"; Туалет = новый ObservableRangeCollection(); AddCommand = новый AsyncCommand(AddAsync); RemoveCommand = новый AsyncCommand(RemoveAsync); RefreshCommand = новая AsyncCommand (RefreshAsync); SelectedCommand = новый AsyncCommand(SelectedAsync); } асинхронная задача AddAsync (определение местоположения) { var name = await App.Current.MainPage.DisplayPromptAsync("Имя местоположения", "Имя местоположения"); // var адрес = "Широта: {pinlocation.Latitude}, Долгота: {pinlocation.Longitude}, Высота: {location.Altitude}"; адрес вар = "тест"; var username = await App.Current.MainPage.DisplayPromptAsync("Имя пользователя", "Имя пользователя туалетного сумматора"); вар широта = pinlocation.Latitude; вар долгота = pinlocation.Longitude; если (имя == null || адрес == null || имя пользователя == null) { return; } ждут InternetRestroomService.AddPinAsync(имя, адрес, имя пользователя, широта, долгота); ожидайте RefreshAsync(); } асинхронная задача RemoveAsync (туалет в туалете) { ждут InternetRestroomService.RemovePinAsync(restroom.Id); ожидайте RefreshAsync(); } асинхронная задача RefreshAsync() { IsBusy = правда; ждать Task.Delay(2000); Туалет.Очистить(); вар туалеты = ждут InternetRestroomService.GetPinAsync(); Restroom.AddRange(туалеты); IsBusy = ложь; } асинхронная задача SelectedAsync (туалет, туалет) { если (туалет == ноль) возвращаться; var маршрут = $"{nameof(RestroomDetailPage)}?RestroomId={restroom.Id}&"; дождитесь Shell.Current.GoToAsync(маршрут); } общедоступное статическое местоположение GetLocation() { пытаться { Расположение местоположения = новое(); местоположение = Геолокация.По умолчанию.GetLastKnownLocationAsync().Результат; если (местоположение!= ноль) место возврата; } поймать (Исключение ex) { Debug.WriteLine($"Невозможно получить местоположение: {ex.Message}"); Application.Current.MainPage.DisplayAlert("Ошибка!", ex.Message, "ОК"); } вернуть ноль; } } } InternetRestroomDetailViewModel.cs
с использованием Dook.Shared.Models; использование MvvmHelpers.Commands; использование MvvmHelpers; использование системы; использование System.Collections.Generic; используя System.Linq; использование System.Text; использование System.Threading.Tasks; использование Dook.Services; пространство имен Dook.ViewModel { общедоступный класс InternetRestroomDetailViewModel: BaseViewModel { public ObservableRangeCollection Обзор {get; набор; } общественный AsyncCommand RefreshCommand {get; } общественный AsyncCommand AddCommand {получить; } общественный AsyncCommand RemoveCommand {get; } общедоступный ИнтернетResroomDetailViewModel() { Заголовок = «Мой отзыв»; Обзор = новый ObservableRangeCollection(); RefreshCommand = новая AsyncCommand (RefreshAsync); AddCommand = новый AsyncCommand (AddAsync); RemoveCommand = новый AsyncCommand(RemoveAsync); } асинхронная задача AddAsync() { var username = await App.Current.MainPage.DisplayPromptAsync("Имя пользователя", "Имя пользователя для проверки"); var stars = await App.Current.MainPage.DisplayPromptAsync("Звезды", "Звезды за обзор", maxLength: 1, клавиатура: Keyboard.Numeric); var text = await App.Current.MainPage.DisplayPromptAsync("Текст", "Добавить текст", maxLength: 50); if (имя пользователя == null || звезды == null || текст == null) { return; } ждут InternetReviewService.AddReviewAsync(имя пользователя, Double.Parse(звездочки), текст); ожидайте RefreshAsync(); } асинхронная задача RemoveAsync (обзор обзора) { ждут InternetReviewService.RemoveReviewAsync(review.Id); ожидайте RefreshAsync(); } асинхронная задача RefreshAsync() { IsBusy = правда; ждать Task.Delay(2000); Обзор.Очистить(); вар обзоры = ждут ReviewService.GetReviewAsync(); Review.AddRange(обзоры); IsBusy = ложь; } } }
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»