基本 MVC 视图将模型属性返回为空

本文关键字:返回 属性 模型 MVC 视图 基本 | 更新日期: 2023-09-27 18:35:46

这是设置:

型:

public class Device
{
    [Key]
    public int Id { get; set; }
    [MaxLength(50)]
    public String Name { get; set; }
    public Category Category { get; set; }
    public Manufactor Manufactor { get; set; }
    public virtual ICollection<Comment> Comments { get; set; }
    public virtual ICollection<Status> Status { get; set; }
}

控制器操作:

public ActionResult Index()
{
   var devices = db.Devices.Include("Categories").Include("Manufactors").Select(x => new Device
                   {
                        Name = x.Name,
                        Category = x.Category,
                        Comments = x.Comments,
                        Manufactor = x.Manufactor,
                        Status = x.Status
                    });
    return View(db.Devices.ToList());
}

视图:

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Name)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Manufactor.Name)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Category.Name)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Status)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.Id }) |
            @Html.ActionLink("Details", "Details", new { id=item.Id }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.Id })
        </td>
    </tr>
}

这里的问题是,只显示名称,但item.Categoryitem.Manufactor不显示。如果我将该行更改为简单的@item.Category.Name 则会遇到空引用异常。

查看我的数据库到设备表中,列出了 2 个设备,每个设备都有一个 CategoryId 和 ManufactorId。

我认为这是20分钟的不费吹灰之力,但似乎我在某个地方犯了大错。请帮我解决此错误。

如果您需要其他代码,只需将其发布在评论中即可。

亲切问候

编辑:回应那些非常有用的答案:错误是我的控制器操作错误。此解决方案有效:

return View(db.Devices.Include(d => d.Manufactor).Include(d => d.Category).ToList());

基本 MVC 视图将模型属性返回为空

您的模型属性称为 Category ,而不是Categories,因此请确保您正在制作正确的Include

db.Devices.Include("Category")...

当然,Manufacturers也是如此。您的模型属性称为Manufactor而不是Manufactors因此请包含正确的属性:

.Include("Manufactor")

现在,EF 将在表中进行适当的联接,并冻结可在视图中使用的CategoryManufactor属性。

除了Darin的回答:还有一个可用的Include()方法的强类型变体,当你使用不存在的属性时,它会在编译时警告你:

db.Devices.Include(d => d.Category)

参考: DbExtensions.Include()