3

我想了解(并最终欣赏,因为现在它只是痛苦......)MVC 中的更多 ViewModel 和强类型视图。

我的视图模型

public class Combined
    {
        public IEnumerable<Domain> Domains { get; set; }
        public IEnumerable<RegInfo> RegInfos { get; set; }

        public Combined(IEnumerable<Domain> domains, IEnumerable<RegInfo> reginfos)
        {
            this.Domains = domains;
            this.RegInfos = reginfos;
        }

控制器中,我将数据从存储库传递到组合类型的对象。

public ActionResult RegDetails(int id = 0)
        {
            var domain = from x in unitofwork.DomainRepository.Get(n => n.ID == id)
                         select x;

            var reginfo = from y in unitofwork.ReginfoRepository.Get(n => n.ID == id)
                          select y;

            var regdetails = new Combined(domain, reginfo);

            return View(regdetails);
        }

在视图中(使用 Razor)我有 @model project.namespace.Combined 所以我传递了一个包含两个列表的对象。

1/ 为什么我不能像@Model.Domain.Name 这样访问每个列表项(问题很简单,但请帮助我理解其背后的逻辑)?我可以通过使用连接来形成视图“级别”,但这完全违反 MVC 模式。我认为加入这两个表的唯一地方是在 Controller 中,但它会创建全新的对象,所以我需要为它创建一个模型吗?

2/ 获取 IEnumerable 对象的最佳方法是什么,该对象将保存来自 2 个或更多表的数据,这些表可用于填充视图(连接、自动映射器)?

3/ 有没有一种方法可以让我创建一个模型,我可以使用该模型从一个表单发布到多个表?

提前致谢。

4

2 回答 2

5

在控制器操作中获取实体的逻辑很好;这是控制器的工作。但是,您不需要在视图模型上使用自定义构造函数:只需使用对象初始化即可。

var regdetails = new Combined { Domains = domain, RegInfos = reginfo }

现在,就您的视图模型而言,Domains并且RegInfosIEnumerables,但您只为每个获取一个对象。如果您的意图是拥有一个列表类型,那么您应该修改您的 LINQ 以选择多个项目,但如果您的意图实际上是每个项目只有一个对象,那么您不应该IEnumerable在视图模型中使用 s。

public class Combined
{
    public Domain Domain { get; set; }
    public RegInfo RegInfo { get; set; }
}

如果你这样做,那么你能够访问实例Name上的属性。但是,如果您将它们保留为列表类型,那么您必须在视图中遍历它们(即使列表中只有一项):Domain@Model.Domain.Name

@foreach (var domain in Model.Domains)
{
    // Do something with domain.Name
}
于 2013-10-22T15:43:23.160 回答
2

您确实在视图中获得了 Model 属性,并且您可以像在 c# 中那样使用 Domains 和 RegInfos 属性。例如 :

@{
    var firstDomain = Model.Domains.FirstOrDefault();
    // do some process with this variable
}

或者 :

@foreach(var regInfo in Model.RegInfos)
{
    // do some other process        
}

如果显示的数据来自各种数据源,最好制作一个特定的视图模型。您需要避免在视图中进行计算或应用业务规则,数据应在此之前预先格式化。另一个好处是只将所需的数据传递给您的视图:您不想从数据库中获取一个巨大的对象(或集合)只是为了 2 个显示的属性。

提交表单时也可以使用该视图模型。如果您的帖子操作具有视图模型类型的参数,并且您在视图中正确生成输入(通过使用一些 HtmlHelper,如 Html.Editor(For) 等),您可以将其取回。

无论如何,关于强类型视图有很多话要说,并且可以在网络上找到许多资源/教程。

于 2013-10-22T15:41:38.820 回答