如何在ASP.NET MVC中隐式创建父子关系?

时间:2019-07-18 17:44:34

标签: c# asp.net-mvc asp.net-core

我是第一次使用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);
}

1 个答案:

答案 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>

并且服务器端与您当前的代码相同。