如何在Blazor客户端的列表中显示外键名称 在编写Blazor应用时,尝试使用组件的方式要比使用 code 的方式来思考。

我正在尝试显示一门课程的主题名称,该课程是在客户端Blazor应用程序中从数据库驱动的下拉列表中保存该主题的。该值返回为Guid而不是主题名称。有谁与Blazor完成此任务?我在Blazor文档或任何教程中都找不到任何可以解决我遇到的问题的东西。这是在Blazor客户端,我正在使用Entity Framework Core

这是我的“课程”模型在“共享”项目中的样子:

public class Course
    {
        public Guid CourseID { get; set; }

        [Required]
        public string CourseCode { get; set; }

        [Required]
        public string CourseName { get; set; }

        public string CourseSubject { get; set; }

        public string Coursecredits { get; set; }
    } 

这是我的主题模型在共享项目中的样子:

public class Subject
    {
        public Guid SubjectID { get; set; }

        public string SubjectName { get; set; }
    } 

这是我在Server项目中的CourseData数据访问模型:

ApplicationDbContext db = new ApplicationDbContext ();

public IEnumerable<Course> GetallCourses()
        {
            try
            {
                return db.Courses.ToList();
            }
            catch
            {
                throw;
            }
        } 
        public void AddCourse(Course course)
        {
            try
            {
                db.Courses.Add(course);
                db.SaveChanges();
            }
            catch
            {
                throw;
            }
        } 

这是我在Server项目中的SubjectData数据访问模型:

ApplicationDbContext db = new ApplicationDbContext ();

        public IEnumerable<Subject> GetallSubjects()
        {
            try
            {
                return db.Subjects.ToList();
            }
            catch
            {
                throw;
            }
        }    
        public void AddSubject(Subject subject)
        {
            try
            {
                db.Subjects.Add(subject);
                db.SaveChanges();
            }
            catch
            {
                throw;
            }
        } 

这是我在Server项目中的课程控制器:

CourseData objcourse = new CourseData();

        [HttpGet]
        [Route("api/Courses/Courses")]
        public IEnumerable<Course> Index()
        {
            return objcourse.GetallCourses();
        }
        [HttpPost]
        [Route("api/Courses/Create")]
        public void Create([FromBody] Course course)
        {
            if (ModelState.IsValid)
                objcourse.AddCourse(course);
        } 

这是我如何在“客户”项目的“课程创建”页面中保存值的方法:

@page "/Courses/Create"
@inject HttpClient Http
@inject microsoft.AspNetCore.Components.Navigationmanager Navigationmanager

<h1>Add Course</h1>
<hr />
<div class="row">
    <div class="col-md-4">
        <div>
            <div class="form-group">
                <label for="CourseCode" class="control-label">Course Code</label>
                <input for="CourseCode" class="form-control" @bind="@course.CourseCode" />
            </div>
            <div class="form-group">
                <label for="CourseName" class="control-label">Course Name</label>
                <input for="CourseName" class="form-control" @bind="@course.CourseName" />
            </div>
            <div class="form-group">
                <label for="CourseSubject" class="control-label">Subject</label>
                <select class="form-control" @bind="@course.CourseSubject">
                    <option></option>
                    @foreach (var subject in subjectList)
                    {
                        <option value="@subject.SubjectID">@subject.SubjectName</option>
                    }
                </select>
            </div>
            <div class="form-group">
                <label for="Coursecredits" class="control-label">Course credits</label>
                <input for="Coursecredits" class="form-control" @bind="@course.Coursecredits" />
            </div>
            <div class="form-group">
                <button type="submit" class="btn btn-default" @onclick="@CreateCourse">Save</button>
                <button class="btn" @onclick="@cancel">Cancel</button>
            </div>
        </div>
    </div>
</div>
@functions {
    List<Subject> subjectList = new List<Subject>();

    Course course = new Course();

    protected override async Task OnInitializedAsync()
    {
        subjectList = await Http.GetJsonAsync<List<Subject>>("api/Subjects/Subjects");
    }

    protected async Task CreateCourse()
    {
        await Http.SendJsonAsync(HttpMethod.Post,"/api/Courses/Create",course);
        Navigationmanager.NavigateTo("/Courses/Courses");
    }

    void cancel()
    {
        Navigationmanager.NavigateTo("/Courses/Courses");
    }
} 

最后这是我的客户项目中的“课程”列表页面,它返回主题名称的Guid,为此,我想显示主题名称而不是Guid:

@page "/Courses/Courses"
@inject HttpClient Http
<h1>Courses</h1>
<p>
    <a href="/Courses/Create">Create New</a>
</p>
@if (courseList == null)
{
    <p><em>Loading...</em></p>
}
else
{
    <table class='table'>
        <thead>
            <tr>
                <th>Course Code</th>
                <th>Course Name</th>
                <th>Subject</th>
                <th>credits</th>
                <th>actions</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var course in courseList)
            {
                <tr>
                    <td>@course.CourseCode</td>
                    <td>@course.CourseName</td>
                    <td>@course.CourseSubject</td>
                    <td>@course.Coursecredits</td>
                    <td>
                        <a href='/Courses/Edit/@course.CourseID'>Edit</a>  |
                        <a href='/Courses/Delete/@course.CourseID'>Delete</a>
                    </td>
                </tr>

            }
        </tbody>
    </table>
}
@functions {
    Course[] courseList;

    protected override async Task OnInitializedAsync()
    {
        courseList = await Http.GetJsonAsync<Course[]>
        ("/api/Courses/Courses");
    }
} 

请求的数据库上下文:

public class ApplicationDbContext : DbContext
    {
        public virtual DbSet<Course> Courses { get; set; }
        public virtual DbSet<Subject> Subjects { get; set; }
        protected override void Onconfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
                optionsBuilder.UseSqlServer(@"REMOVED-FOR-SECURITY");
            }
        }
    } 

我们将不胜感激。

map712 回答:如何在Blazor客户端的列表中显示外键名称 在编写Blazor应用时,尝试使用组件的方式要比使用 code 的方式来思考。

其他答案很好,但让我给您一些其他思考...

在编写Blazor应用时,尝试使用组件的方式要比使用 code 的方式来思考。

例如,假设Subjects是不变的静态数据。因此,如果每次显示列表或为它们构建下拉列表时,都可能需要进行数据库调用或SQL JOIN?因此,我的第一个想法是为GUID-to-Subject-name创建一个查找缓存。而且由于是Blazor(如果它缓存在客户端上),您不再需要进行数据库或API调用-它只需加载一次。

然后,由于我们在Blazor,所以我将创建一个<SubjectName>组件,例如

   Subject: <SubjectName Id="@Model.SubjectId" />

该组件使用缓存获取值,它可以处理空值,可以处理无效的主题ID。您将行为和错误处理的很多封装在一个地方,并且每次需要将ID映射到主题名称时都可以重复使用。

类似地,我将再次使用缓存创建一个<SubjectDropdown>组件以显示主题列表。

,

您将CourseSubject的{​​{1}}设置为Guid,因此您将获得Guid。 如果要显示主题名称,请按其Guid请求主题,或在课程中返回主题:

SubjectID
本文链接:https://www.f2er.com/3074926.html

大家都在问