2

我有两个模型:爬行动物和物种。Reptile 有一个 Species,作为 ID 存储在数据库中: 在此处输入图像描述

我应该如何设置 Reptile 的详细信息控制器操作/视图,以便它显示 Species 的 Title 属性而不是 Reptile 使用的 ID?

我最初的想法只是抓取控制器中的数据并将其传递到 ViewBag 中,但这似乎不合适,并且在设置列表操作时过于复杂。

这样做的正确方法是什么?

似乎我需要制作一个视图模型,但让我感到困惑的是如何正确设计它以便没有太多的数据库调用。

这是我对 ViewModel 的初步尝试:

public class ReptileDetailsModel
{
    [Required]
    public String Species { get; set; }

    //etc...

    public ReptileDetailsModel(Reptile reptile)
    {
        this.Species = reptile.Species.Title;

        // etc...
    }
}
4

3 回答 3

1

以更通用的方式实现相同目的的另一种方法是使用AutoMapper

我能想到的几个优点:

  • 自动映射确切的属性(您只需要指定规则例外的任何内容)
  • 集中在一个类/方法中,无论如何
  • 能够忽略,映射到另一个类属性,甚至自定义逻辑
  • 非侵入式,由您决定如何/何时使用它。

在您的特定情况下,我会创建一个类似的映射器

Mapper.CreateMap<Reptile, ReptileDetailsModel>()
    .ForMember(dest => dest.Species, 
        options => options.MapFrom(source => source.Species.Title));

此映射器信息需要在某处注册。在我参与的 MVC 项目中,我会将映射器注册到 global.asax。

然后在您的控制器中,您需要调用映射器将您的爬行动物实例映射到您的模型

ReptileDetailsModel model = Mapper.Map<ReptileDetailsModel>(reptile);

在 MVC 中使用 AutoMapper 的方法有很多,但这可能只是一个开始。

于 2013-09-26T01:45:34.143 回答
0

将 Species 类设置为强类型 Reptile View 的模型。然后显示它的 Title 属性。您的操作方法应如下所示:

public ActionResult Reptile(Reptile rep)
{
    return View(db.Species.Where(x=>x.ID == rep.SpeciesID).Single());
}

这样,您只需调用一次数据库即可生成视图。

于 2013-09-26T09:19:10.453 回答
0

我当时没有意识到,但我正在使用:

public ActionResult Index()
{
    using (var db = new ModelsContainer())
    {
        return View(db.Reptiles.ToList());
    }
}

这导致数据库(以及模型属性)在视图呈现之前过期,从而导致此错误(为搜索引擎添加):

The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.
于 2013-09-26T02:41:22.297 回答