【发布时间】:2020-03-14 18:17:46
【问题描述】:
我正在尝试显示我从客户端 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; }
}
这是我在服务器项目中的 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;
}
}
这是我在服务器项目中的 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;
}
}
这是我在服务器项目中的课程控制器:
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");
}
}
}
我们将不胜感激。
【问题讨论】:
标签: foreign-keys entity-framework-core blazor blazor-client-side