You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MAUI MVVM架构登录系统无响应问题排查及方案请求

问题原因分析

核心失效原因

  • 缺少绑定的命令实现:XAML中按钮绑定了Command="{Binding LoginCommand}",但你的LoginViewModel里只有私有异步方法Login(),没有公开的ICommand类型的LoginCommand属性,导致按钮点击事件无法触发。
  • API地址格式错误:请求地址http:///bp/utentes缺少服务器域名或IP(比如应该是http://your-server-ip/bp/utentes),会直接导致API请求失败。
  • Model类访问权限不足:users类及嵌套的Result、Root类默认是internal访问级别,反序列化或跨组件访问时可能出现权限问题。
  • 缺少用户反馈逻辑:登录成功/失败后没有任何提示,无法直观判断流程是否执行。
解决方案

1. 实现LoginCommand(核心修复)

MAUI中绑定命令需要实现ICommand,推荐使用官方推荐的AsyncRelayCommand(来自CommunityToolkit.Mvvm包),步骤如下:

第一步:安装依赖包

在NuGet包管理器中安装Microsoft.Toolkit.Mvvm,该包提供了简化的命令和属性通知实现。

第二步:修改LoginViewModel

继承ObservableObject替代手动实现INotifyPropertyChanged,并添加LoginCommand:

using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json;
using thebridgeproject.Models;
using Microsoft.Toolkit.Mvvm.ComponentModel;
using Microsoft.Toolkit.Mvvm.Input;

namespace thebridgeproject.ViewModels
{
    // 改用ObservableObject,自动处理属性变更通知
    public partial class LoginViewModel : ObservableObject
    {
        [ObservableProperty]
        private string _username;

        [ObservableProperty]
        private string _password;

        // 用RelayCommand特性生成登录命令
        [RelayCommand]
        private async Task Login()
        {
            using (var httpClient = new HttpClient())
            {
                // 替换为你的实际服务器地址
                httpClient.DefaultRequestHeaders.Add("Authorization", "RaV9N");
                var response = await httpClient.GetAsync("http://your-server-ip/bp/utentes");

                if (response.IsSuccessStatusCode)
                {
                    var content = await response.Content.ReadAsStringAsync();
                    var users = JsonConvert.DeserializeObject<users.Root>(content);

                    if (users.success)
                    {
                        var user = users.result.FirstOrDefault(x => x.Nome == Username);
                        if (user != null && VerifyPassword(user.Password, Password))
                        {
                            await App.Current.MainPage.DisplayAlert("成功", "登录成功!", "确定");
                            // 示例:跳转到主页
                            // await Shell.Current.GoToAsync("//MainPage");
                        }
                        else
                        {
                            await App.Current.MainPage.DisplayAlert("失败", "用户名或密码错误", "确定");
                        }
                    }
                    else
                    {
                        await App.Current.MainPage.DisplayAlert("错误", $"API请求失败:{users.message}", "确定");
                    }
                }
                else
                {
                    await App.Current.MainPage.DisplayAlert("错误", $"网络请求失败,状态码:{response.StatusCode}", "确定");
                }
            }
        }

        private bool VerifyPassword(string hashedPassword, string enteredPassword)
        {
            return BCrypt.Net.BCrypt.Verify(enteredPassword, hashedPassword);
        }
    }
}

注:[ObservableProperty]和[RelayCommand]是源生成特性,会自动生成对应的属性和命令,大幅简化代码。

2. 修复Model类访问权限

将users类及嵌套类改为public,避免权限问题:

using System.Collections.Generic;

namespace thebridgeproject.Models
{
    public class users
    {
        public class Result
        {
            public int NumUtente { get; set; }
            public string Nome { get; set; }
            public string Password { get; set; }
            public string Morada { get; set; }
            public string Cidade { get; set; }
            public string DataNascimento { get; set; }
            public string NumTlf { get; set; }
        }

        public class Root
        {
            public bool success { get; set; }
            public string message { get; set; }
            public List<Result> result { get; set; }
        }
    }
}

3. 修复API地址

将http:///bp/utentes替换为实际的服务器地址,比如http://192.168.1.100:5000/bp/utentes(根据你的API部署情况调整)。

4. 可选:完善XAML绑定声明

显式声明双向绑定(MAUI默认是双向,但显式声明更清晰):

<Entry Text="{Binding Username, Mode=TwoWay}" Margin="20,0,0,0" VerticalOptions="Center" Placeholder="Username"/>
<Entry Text="{Binding Password, Mode=TwoWay}" Margin="20,0,0,0" VerticalOptions="Center" Placeholder="Password" IsPassword="True" />
验证步骤
  1. 安装NuGet包后重新编译项目;
  2. 替换正确的API地址;
  3. 运行项目,输入用户名密码点击登录,现在应该能触发登录逻辑并看到对应提示。

内容的提问来源于stack exchange,提问作者Rafael Silva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 16:00:59