Basic MVC View将模型属性返回为null

时间:2013-10-17 19:55:08

标签: c# asp.net-mvc razor-2

这是设置:

型号:

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; }
}

ControllerAction:

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,我将遇到Nullreference异常。

将我的数据库放入设备表中,列出了2个设备,每个设备都有一个CategoryId和ManufactorId。

我认为这是一个20分钟的明智,但似乎我在某处非常错误。请帮我解决这个错误。

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

亲切的问候

修改 回答那些非常有用的答案:错误是我错误的控制器操作。 这个解决方案有效:

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

2 个答案:

答案 0 :(得分:4)

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

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

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

.Include("Manufactor")

现在EF会在表格中进行正确的连接,并为您在视图中使用的CategoryManufactor属性提供保管。

答案 1 :(得分:3)

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

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

参考:DbExtensions.Include()