Maui MVVM,测试应用程序从登录 API 获取数据并在登录后将 FullName 传递到 MainPage 时出现问题,FullName=null 退出 ViewModel

问题描述 投票:0回答:1

1-我通过 MVC 创建一个 API 来获取

string MaUserName,
    string MaPassword,
    int MaId,
    int MaStatus,
    string MaFullName

它与 Postman 和 swagger 配合得很好

2-我创建了一个项目,其中有

  • 型号>
        Manager.cs

    *视图模型>
        LoginVM.cs

    *启动页面>
        LoginPage.xaml

    *查看>
        MainPage.xaml

BaseViewModel : INotifyPropertyChanged 

当我输入用户名和密码时

public async Task<int> ExecuteLoginCommand(string username, string password)

通过此代码成功后进入主页即可。

我的 API 接收该用户的用户名、密码和返回的 ID——它工作正常。

我在 API 中有其他方法接收 ID 并返回该 ID 的所有日期 当我将 id 发送到此方法时,我收到了字符串形式的所有信息。 通过 JSON 转换器 我从中得到

MaFullName
- 好吧。

结束后

   public async Task<int> ExecuteLoginCommand(string username, string password)

Model>Manager 的所有值 = null - 这是问题

我将展示所有代码

public partial class Manager
{
    public int MaId { get; set; }
    public string MaUsername { get; set; } = null!;
    public string MaPassword { get; set; }
    public string MaFullname { get; set; }
    public int? MaStatus { get; set; }
}
 public partial class LoginVM : BaseViewModel
 {
     private string _username;
     private string _password;
     private string _fullname ;
     private bool _isUsernameValid;
     private bool _isPasswordValid;
     public int id = 0;
     private readonly HttpClient _httpClient;
     public ICommand LoginCommand { get; set; }
     public string Username
     {
         get => _username;
         set => SetProperty(ref _username, value);
     }
     public string Password
     {
         get => _password;
         set => SetProperty(ref _password, value);
     }
     public bool IsUsernameValid
     {
         get { return _isUsernameValid; }
         set
         {
             if (_isUsernameValid != value)
             {
                 _isUsernameValid = value;
                 OnPropertyChanged();
             }
         }
     }
     public bool isPasswordValid
     {
         get { return _isPasswordValid; }
         set
         {
             if (_isPasswordValid != value)
             {
                 _isPasswordValid = value;
                 OnPropertyChanged();
             }
         }
     }
     public string MaFullname
         
     {
         get => _fullname ?? "Error";
         set
         {
             if (_fullname != value)
             {
                 _fullname = value;
                 OnPropertyChanged();
             }
         }
     }
     public LoginVM()
     {
         _httpClient = new HttpClient();
         LoginCommand = new Command(async () => await ExecuteLoginCommand(Username, Password));
     }
     // check user and password
     public async Task<int> ExecuteLoginCommand(string username, string password)
     {

         HttpResponseMessage responseu = await _httpClient.GetAsync("http://127.0.0.1:5000/api/Managers/GetManagersu/" + username + "," + password);
         int isUsernameValid = await responseu.Content.ReadFromJsonAsync<int>();
         if (responseu.IsSuccessStatusCode && isUsernameValid != 0)
         {
             id = isUsernameValid;
             HttpResponseMessage responseid = await _httpClient.GetAsync("http://127.0.0.1:5000/api/Managers/" + id);
             string jsonfullname = await responseid.Content.ReadAsStringAsync();
             JsonConvert.DeserializeObject<Manager>(jsonfullname);
             // _fullname = manager.MaFullname;
             Console.WriteLine(MaFullname);
             await Shell.Current.GoToAsync($"//MainPage");
             return (isUsernameValid);
         }
         else
         {
             return 0;
         }
     } // end excutedlogincommand
 }
public class BaseViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged([CallerMemberName] string name = "") =>
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));


    protected bool SetProperty<T>(ref T backingField, T value, [CallerMemberName] string propertyName = null)
    {
        if (EqualityComparer<T>.Default.Equals(backingField, value)) return false;
        backingField = value;
        OnPropertyChanged(propertyName);
        return true;
    }
}

运行此应用程序,登录页面

enter image description here

登录后

enter image description here

我应该看到“我的全名” 但这一行有“错误”:

 public string MaFullname
 {
     get => _fullname ?? "Error";
  1. 我尝试使用 ChatGPT 但没有解决方案。
  2.  ExecuteLoginCommand()
    之后设置一个静态值,就可以了
  3. 检查我的API并收到
    MaFullName
testing mvvm binding maui
1个回答
0
投票
if (responseu.IsSuccessStatusCode && isUsernameValid != 0)
         {
             id = isUsernameValid;
             HttpResponseMessage responseid = await _httpClient.GetAsync("http://127.0.0.1:5000/api/Managers/" + id);
             string jsonfullname = await responseid.Content.ReadAsStringAsync();
             JsonConvert.DeserializeObject<Manager>(jsonfullname);
             // _fullname = manager.MaFullname;
             Console.WriteLine(MaFullname);
             await Shell.Current.GoToAsync($"//MainPage");
             return (isUsernameValid);
         }

从您分享的上面的代码中,我们可以发现您想使用代码

JsonConvert.DeserializeObject<Manager>(jsonfullname);
来反序列化Object,但是您没有将结果分配给任何变量,例如类
Manager
的实例或将其分配给变量
public string MaFullname
在你的
LoginVM

因此,您将无法通过代码

MaFullname
LoginVM.cs
中获得正确的
Console.WriteLine(MaFullname);
值。

您可以参考以下代码来反序列化对象:

 //code snippet
   object obj=  JsonConvert.DeserializeObject<Manager>(jsonfullname);

   if (obj != null && obj is Manager)
   {
      Manager item = obj as Manager;

       MaFullname = item.MaFullname;
   }
© www.soinside.com 2019 - 2024. All rights reserved.