我是第一次使用MVC使用ASP.NET Core,并开始了我的第一个项目。我有两个简单的模型类。有一个Course
类,具有标题和描述,而有一个Article
类,具有标题,描述,内容以及对包含该文章的课程的引用。我写文章指向其包含过程的逻辑是,它简化了数据库查询并使回溯更加简洁。我正在将ASP.NET Core 2.2与MVC框架一起使用。我通过搭建文章和课程控制器来生成CRUD视图。
Models / Article.cs + Models / Course.cs
public class Article
{
public int Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public string Content { get; set; }
public Course Course { get; set; }
}
public class Course
{
public int Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
}
在应用程序中,用户应该能够创建课程,查看课程的文章并创建文章。用户不必指定文章所属的课程。本质上,我想在课程详细信息页面中创建一个链接,该链接重定向到带有传入课程的文章创建页面。当用户创建时,我应该如何将课程ID或课程从课程控制器传递给文章控制器 这是组织数据的好方法吗?
我尝试了使用查询参数的标准链接,但无法弄清楚如何将courseId
转移到创建文章POST操作中。
视图/课程/Details.cshtml
<a asp-action="Create" asp-controller="Articles" asp-route-courseId="@course.Id">Create New</a>
Controllers / ArticlesController.cs
public async Task<IActionResult> Create(int? courseId, [Bind("Id,Title,Description,Content")] Article article)
{
if (ModelState.IsValid)
{
if (courseId != null)
{
article.Course = await _context.Course
.FirstOrDefaultAsync(m => m.Id == courseId);
}
_context.Add(article);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(View), new { id = article.Id });
}
return View(article);
}
我知道我可以创建一个具有课程ID属性而不是课程属性的新视图模型,但这似乎是一个糟糕的解决方案。
为了解决我认为是一种优雅的解决方案的问题,我在控制器中部分构造了article对象,并将其传递到create视图中,并使用了以下 Nan Yu 建议的代码部分
public async Task<IActionResult> Create(int? courseId)
{
Article article = new Article
{
Course = await _context.Course
.FirstOrDefaultAsync(m => m.Id == courseId)
};
return View(article);
}
答案 0 :(得分:0)
我知道我可以创建一个具有课程ID属性而不是课程属性的新视图模型,但这似乎是一个糟糕的解决方案。
否,最好使用包含视图所需属性的视图模型,它有助于消除实体类与UI层之间的牢固耦合。
在不更改当前代码以使用视图模型的情况下,您可以包括一个隐藏字段以帮助提交courseId
:
<form asp-controller="Articles" asp-action="Create" method="post" >
<div >
....
<input type="hidden" name="courseId" value="@course.Id">
.....
<input id=" " type="submit" value="submit" />
</div>
</form>
并且服务器端与您当前的代码相同。