我正在尝试显示一门课程的主题名称,该课程是在客户端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");
}
}
}
我们将不胜感激。