如何使用ASP.NET Core执行CRUD操作的Blazor服务器端应用程序

307 阅读7分钟

使用ASP.NET Core执行CRUD操作的Blazor服务器端应用程序

当一个页面第一次被请求时,以及当页面被发布回服务器时,就会发生服务器端处理。例如,验证、保存和检索数据,以及导航到其他页面,都是服务器端处理的例子。

在本教程中,你将学习如何从头开始创建一个Blazor服务器端应用程序并在其中执行CRUD操作。你将执行的CRUD操作类型包括创建、读取、更新和删除列表中的数据。

先决条件

要完成本教程,你需要具备以下条件。

  • 对[Blazor框架]有基本了解
  • 具有[C#]语言的基本知识
  • 安装Microsoft Visual Studio。
  • 基本的[HTML]知识
  • 一个基本的[ASP.NET核心]知识

现在,我们将打开Microsoft Visual Studio,选择New Project ,如下图所示,然后点击下一步。

New project

在下一个屏幕上,选择Blazor Server App ,然后点击下一步,如下图所示。

Type of Application

在下一个屏幕上,选择你的应用程序的名称,即Blazor server app ,并点击下一步,如下图所示。

Name of app

在下一个屏幕上,选择你的目标框架,在这种情况下,我们将使用.NET Core 3.1(Long-term Support) ,点击Create

Target framework

现在运行该应用程序,看看它在网络浏览器中是什么样子。它看起来应该是这样的。

Appearance

该网站有三个页面。我们还将添加一个页面来获取学生的数据,并在其中执行CRUD 操作。

创建和读取列表中的数据

在共享文件夹中,有一个名为NavMenu.razor 的文件。这个文件将被用来创建一个指向新创建的页面的链接。

为了创建students page ,我们需要在文件中添加以下HTML代码。

<li class="nav-item px-3">
            <NavLink class="nav-link" href="students">
                <span class="oi oi-plus" aria-hidden="true"></span> Students
            </NavLink>
</li>

我们还需要添加一个剃刀组件并命名为Students.razor 。要做到这一点,右击pages文件夹并选择Razor component

然后,输入组件的名称,即Students.razor ,并点击Add

Component

为了获取学生的数据,我们将需要在Data 文件夹中创建一个类。在文件夹名称上点击右键,选择类。

我们将在IStudentService.cs 文件中创建一个名为IStudentService.cs 的接口,它将有一些方法。

我们还将通过上述同样的程序创建一个名为StudentService 的接口的实现。但是,这一次你将点击Class ,而不是InterfaceStudentService 继承于IStudentService

你还将在IStudentService.cs 文件中创建方法。第一个方法将返回一个学生的列表。

我们将在Data folder 中获取这个学生列表。下面的代码是用来获取学生的数据的。

namespace Blazor_Server_App.Data
{
    interface IStudentService
    {
        List<Student> GetStudent();}
}

我们将在StudentService 文件中实现上述方法。我们将创建一个字段的私有属性来使用学生的列表。我们将通过创建一个私有的学生列表并返回它来实现,如下面的代码片段所示。

namespace Blazor_Server_App.Data
{
    public class StudentsService : IStudentsService
    {
        private List<Students> students = new List<Students>
        {
            new Students
            {
                Id = Guid.NewGuid(),
                Name = "Student 1"
            },
            new Student
            {
                Id = Guid.NewGuid(),
                Name = "Student 2"
            },
            new Students
            {
                Id = Guid.NewGuid(),
                Name = "Student 3"
            },
        };
    public List<Student> GetStudent()
        {
            return student;
        }
    }
}

StudentsService 为了使用上述方法,我们需要在Student.razor 文件中通过调用inject 关键字注入服务,这样我们就可以在代码中的任何地方使用它。

我们将创建一个名为on load 的重写方法。HTML Code 将学生名单填充到一个表中,并创建一个循环,循环浏览可用的雇员名单。

@page "/students" 是一个与这个组件相匹配的URL,以便被剃刀页面访问。

@page "/students"
<h3>Students</h3>
@inject Blazor_Server_App.Data.IStudentsService StudentService;
<table class ="table">
    <thead>
        <tr>
            <td>Id</td>
            <td>Name</td>
        </tr>
    </thead>
    <tbody>
        @foreach(var student in student)
            {
                <tr>
                    <td>@student.Id</td>
                    <td>@student.Name</td>
                </tr>
            }
    </tbody>
</table>
@code {
    private List<Blazor_Server_App.Data.Student> student;
    protected override void OnInitialized()
    {
        student = StudentService.GetStudent();
    }
}

另外,在startup.cs 文件中,我们将添加一个StudentService 的单子,这样,当我们要求IStudentsService ,它就会给我们StudentService。即。

 public void ConfigureServices(IServiceCollection services)
        {
            services.AddRazorPages();
            services.AddServerSideBlazor();
            services.AddSingleton<WeatherForecastService>();
            services.AddSingleton<IStudentService, StudentService>();
        }

由于我们没有一个学生列表,我们将不得不创建一个学生模型并给出两个属性。

第一个属性得到Identity ,即学生的注册号码。第二个属性得到学生的名字,如下面的代码所实现。

namespace Blazor_Server_App.Data
{
    public class Students
    {
        public Guid Id { get; set; }
        public String Name { get; set; }
    }
}

更新/编辑列表

为了给这个页面创建一个编辑功能,我们需要创建一个链接,将我们的路由从学生的页面带到另一个页面,该页面显示我们想要更新或编辑的学生的详细信息。

要做到这一点,在Student.razor 文件中,我们将在表头中添加一个空的表头,并在表体中添加一个锚标签的动作,该标签有一个我们希望用户发送到的新学生位置。

同时,随着路由,你将传递学生的ID,这样你就可以用ID搜索新位置的学生。

<table class="table">
    <thead>
        <tr>
            <td>ID</td>
            <td>Name</td>
            <td></td>
        </tr>
    </thead>
    <tbody>
        @foreach(var student in students)
            {
                <tr>
                    <td>@student.Id</td>
                    <td>@student.Name</td>
                    <td>
                        <a href="stdudent/@student.Id">Edit</a>
                    </td>
                </tr>
            }
    </tbody>
</table>

现在,我们需要创建一个新的页面来添加和编辑学生。要做到这一点,右击页面文件夹,选择Add 。接下来,选择Razor Component ,并给它一个名字。例如,EditStudent.razor

为了获取Id,我们将在我们的EditStudent.razor 文件中实现下面的代码。

@page "/students{Id}"
<h3>EditStudent</h3>
<h4>Id</h4>
@code {
    [Parameter]
    public String Id { get; set; }
}

我们将需要使用上面的Id并获取学生数据,以便我们可以编辑细节。要做到这一点,我们将进入学生服务接口,创建一个方法来获取学生的详细信息。

我们将在interface IStudentsService 中添加下面的代码行。

Students GetStudents(Guid id);

我们还将在StudentService 文件中通过使用SingleOrDefault 方法实现上述方法。这是因为它不可能是空的,因为它需要返回一些东西。

 public Students GetStudents(Guid id)
        {
            return students.SingleOrDefault(x => x.Id == id);
        }

我们将在EditStudent 组件中使用上面的方法。

@page "/students{id}"
<h3>EditStudent</h3>
@inject Blazor_Server_App.Data.IStudentsService StudentsService;
@inject NavigationManager Navigation
<h4>Id</h4>
<EditForm Model="student" onSubmit ="@submitForm">
    <div class="form-group">
        <label>Id</label>
        <input id="Id" value="@student.Id" name="id" readonly />
    </div>
    <div class="form-group">
        <label>Id</label>
        <inputText id="Name" class="form-control" value ="@student.Name" name="name" @bind-value="student.Name"></inputText>
    </div>
     <button type="submit" class="btn btn-primary">Update</button>
</EditForm>
@code {
    [Parameter]
    public String Id { get; set; }
    private Blazor_Server_App.Data.Students student { get; set; }
    protected override void OnInitialized()
    {
        student = StudentsService.GetStudents(Guid.Parse(Id));
    }
    private void submitForm()
    {
        StudentsService.UpdateStudent(student);
        Navigation.NavigateTo("students");
    }
}

现在,我们已经填充了学生名单中的姓名和ID。接下来,我们需要创建一个更新按钮,这样你就可以更新一个学生,并返回到学生的列表中,能够看到变化。

要做到这一点,我们将进入学生服务接口,创建一个方法来更新学生名单。我们将调用该方法UpdateStudent() ,并将学生模型传递给它。这个方法返回一个空。

 void UpdateStudent(Students students);

我们将在学生服务文件中实现上述接口方法。这个更新学生的方法是先获取学生,然后用新的学生更新列表。

        public void UpdateStudent(Students students)
        {
            var getOldStudent = GetStudents(students.Id);
             getOldStudent.Name = students.Name;
        }

向列表中添加数据

为了向列表中添加一个学生,我们将进入学生服务接口并创建一个添加学生的方法。该方法将是一个void,并接收学生模型。比如说。

void AddStudent(Students students);

下一件事是在学生服务文件中实现上述接口方法。要做到这一点,我们将在服务文件中创建一个新的Id,返回添加到学生模型中的新学生,并将新学生添加到列表中。

 public void AddStudent(Students students)
        {
            var id = Guid.NewGuid();
            students.Id = id;
            Students.Add(students);
        }

接下来,你将在student.razor component 文件中创建一个锚标签,以链接各页面。

<a href="student/0"></a>

EditStudents.razor 文件中,我们将检查id是否为空或空。如果id为零,我们就创建一个新的学生。否则,就从学生服务中获取它。

    private Blazor_Server_App.Data.Students student { get; set; }
    protected override void OnInitialized()
    {
        if (!String.IsNullOrEmpty(Id)& Id == "0")
        {
            student = new Data.Students();
        }
        else
        {
            student = StudentsService.GetStudents(Guid.Parse(Id));
        }
    }

在提交表单中,我们将检查学生是否为空,然后调用学生服务来添加学生。否则,我们将直接更新该雇员。

private void SubmitForm()
    {
        if(student.Id == Guid.Empty)
        {
            StudentsService.AddStudent(student);
        }
        else
        {
            StudentsService.UpdateStudent(student);
        }
        Navigation.NavigateTo("students");
    }

从列表中删除数据

在students' razor页面中,我们将为一个按钮添加另一个表数据,并给它一个值Delete 。之后,我们将给它一个onclick动作和一个方法onDelete ,并将student的值传递给它。

<td>
     <button class = "btn btn-secondary" onclick="@(e=> onDelete(student.Id))">Delete</button>
 </td>

在学生服务接口中,我们将创建一个删除学生的方法,并在学生服务文件中实现该方法。这是通过获取学生数据并将其从列表中删除来实现的。

void DeleteStudent(Guid id);

在学生服务文件中。

public void DeleteStudent(Guid id)
        {
            var student = GetStudents(id);
            students.Remove(student);
        }

总结

在本教程中,我们已经了解了ASP.NET Core中的服务器端blazor。我们还看到了如何使用ASP.NET进行CRUD操作。我们也可以很容易地说出服务器端的blazor与其他客户端的blazor应用程序有什么不同。