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

.NET MAUI注册页面MongoDB插入报错:名称服务器列表不能为空

.NET MAUI注册功能MongoDB连接报错:The list of configured name servers must not be empty.

问题详情

使用.NET MAUI开发学校项目时,点击注册按钮触发报错:

[DOTNET] Error during admin insertion: The list of configured name servers must not be empty. (Parameter 'servers')

已尝试连接本地MongoDB Compass和MongoDB Atlas,问题仍未解决,目标是实现注册账号存入MongoDB的功能。


相关代码

DBConnection类

public class DBConnection
{
    private IMongoDatabase _database;

    public DBConnection()
    {
        try
        {
            var mongoClient = new MongoClient("mongodb+srv://<username>:<password>@cluster0.4jhaesp.mongodb.net/?retryWrites=true&w=majority");

            _database = mongoClient.GetDatabase("homefinder");
            Console.WriteLine("Connection to the database is successful.");
        }
        catch (MongoException ex)
        {
            Console.WriteLine($"Error during database connection: {ex.Message}");
            throw;
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Unexpected error during database connection: {ex}");
            throw;
        }
    }

    public IMongoDatabase GetDatabase()
    {
        if (_database == null)
        {
            throw new InvalidOperationException("Database is not initialized. Make sure DBConnection constructor is called successfully.");
        }

        return _database;
    }
}

SignupViewModel代码

public class Admins
{
    [BsonId]
    public ObjectId Id { get; set; }
    public string Fullname { get; set; }
    public string Username { get; set; }
    public string PasswordHash { get; set; }
    public string Role { get;set; }
}

public class SignupViewModel : BindableObject
{
    private string _fullname;
    private string _username;
    private string _password;
    private string _selectedRole;

    public string Fullname
    {
        get => _fullname;
        set
        {
            _fullname = value;
            OnPropertyChanged(nameof(Fullname));
        }
    }

    public string Username
    {
        get => _username;
        set
        {
            _username = value;
            OnPropertyChanged(nameof(Username));
        }
    }

    public string Password
    {
        get => _password;
        set
        {
            _password = value;
            OnPropertyChanged(nameof(Password));
        }
    }

    public string SelectedRole
    {
        get => _selectedRole;
        set
        {
            _selectedRole = value;
            OnPropertyChanged(nameof(SelectedRole));
        }
    }

    private async Task Signup(string password)
    {
        try
        {
            if (string.IsNullOrWhiteSpace(Fullname) || string.IsNullOrWhiteSpace(Username) || string.IsNullOrWhiteSpace(Password))
            {
                Console.WriteLine("Please fill in all required fields.");
                return;
            }

            var hashedPassword = BCrypt.Net.BCrypt.HashPassword(Password);

            var admin = new Admins
            {
                Fullname = Fullname,
                Username = Username,
                PasswordHash = hashedPassword,
                Role = SelectedRole
            };

            await InsertAdminAsync(admin);

            await App.Current.MainPage.Navigation.PushAsync(new MainPage());
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error during signup: {ex.Message}");
        }
    }

    private async Task InsertAdminAsync(Admins admin)
    {
        try
        {
            var dbConnection = new DBConnection();
            var database = dbConnection.GetDatabase();
            var adminsCollection = database.GetCollection<Admins>("admins");

            await adminsCollection.InsertOneAsync(admin);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error during admin insertion: {ex.Message}");
        }
        
    }
    

public Command<string> SignupCommand => new Command<string>(async (password) => await Signup(password));
}

注册页面XAML代码

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:homefinderpro.ViewModels"
             x:Class="homefinderpro.Page.SignupPage"
             Title="SignupPage">

    <StackLayout Background="#4F59DE" Padding="30">
        <Label Text="SIGN UP" 
               TextColor="White" FontFamily="Poppins-Bold" FontSize="30"
               HorizontalOptions="Center" />

        <Frame BackgroundColor="White" Padding="20" CornerRadius="10">
            <StackLayout>
                <Entry x:Name="FullnameEntry" Placeholder="Full Name" Text="{Binding Fullname}" />
                <Entry x:Name="UsernameEntry" Placeholder="Username" Text="{Binding Username}" />
                <Entry x:Name="PasswordEntry" Placeholder="Password" IsPassword="True" Text="{Binding Password}"/>

                <Picker x:Name="RolePicker" Title="Select Role" SelectedItem="{Binding SelectedRole, Mode=TwoWay}"/>
                        
                <Button Text="SIGN UP"
                        Background="Orange" TextColor="White"
                        Command="{Binding SignupCommand}"/>
            </StackLayout>
        </Frame>

        <Button Text="Already have an account? Login"
                BackgroundColor="Orange" TextColor="White"
                Margin="0,20,0,0"/>
    </StackLayout>
</ContentPage>

解决方案

1. 修正MongoDB连接字符串

  • 替换连接字符串中的<username>和<password>为MongoDB Atlas的真实账号密码,密码含特殊字符需做URL编码
  • 本地MongoDB使用非srv格式:mongodb://localhost:27017/homefinder
  • 从MongoDB Atlas官网Connect->Connect your application复制标准连接字符串,避免手动修改

2. 修复驱动依赖与兼容性

  • 更新MongoDB.Driver和MongoDB.Driver.Core NuGet包至最新版
  • 清理项目缓存后重新生成解决方案

3. 优化DBConnection单例模式

避免每次插入新建连接实例,改用单例减少开销:

public class DBConnection
{
    private static IMongoDatabase _database;
    private static readonly object _lock = new object();

    private DBConnection() { }

    public static IMongoDatabase GetDatabase()
    {
        if (_database == null)
        {
            lock (_lock)
            {
                if (_database == null)
                {
                    try
                    {
                        var mongoClient = new MongoClient("mongodb+srv://your-username:your-password@cluster0.4jhaesp.mongodb.net/?retryWrites=true&w=majority");
                        _database = mongoClient.GetDatabase("homefinder");
                        Console.WriteLine("Connection to the database is successful.");
                    }
                    catch (MongoException ex)
                    {
                        Console.WriteLine($"Error during database connection: {ex.Message}");
                        throw;
                    }
                }
            }
        }
        return _database;
    }
}

4. 修复命令参数传递问题

按钮绑定未传参,修改XAML或命令定义:

  • 方案1:给按钮添加参数绑定
<Button Text="SIGN UP"
        Background="Orange" TextColor="White"
        Command="{Binding SignupCommand}"
        CommandParameter="{Binding Password}"/>
  • 方案2:改为无参命令(推荐,因ViewModel已有Password属性)
public Command SignupCommand => new Command(async () => await Signup());

private async Task Signup()
{
    try
    {
        if (string.IsNullOrWhiteSpace(Fullname) || string.IsNullOrWhiteSpace(Username) || string.IsNullOrWhiteSpace(Password))
        {
            Console.WriteLine("请填写所有必填字段。");
            return;
        }
        var hashedPassword = BCrypt.Net.BCrypt.HashPassword(Password);
        var admin = new Admins
        {
            Fullname = Fullname,
            Username = Username,
            PasswordHash = hashedPassword,
            Role = SelectedRole
        };
        await InsertAdminAsync(admin);
        await App.Current.MainPage.Navigation.PushAsync(new MainPage());
    }
    catch (Exception ex)
    {
        Console.WriteLine($"注册出错: {ex.Message}");
    }
}

5. 添加平台网络权限

  • Android:在AndroidManifest.xml中添加
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  • iOS:在Info.plist中添加(允许HTTP请求)
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

内容的提问来源于stack exchange,提问作者ACGaming PH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:27:03