MVC Viewmodel仅显示模型数据

时间:2015-06-14 19:22:01

标签: asp.net-mvc linq viewmodel

此问题与此链接类似: ViewModel to display partial information

我希望有一个例子。我创建了我的模型,它看起来像这样:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace GuestListTemplate.Models
{
    public class Guest
    {
        public int ID { get; set; }
        [Required]
        [Display(Name = "First Name:")]
        public string FirstName { get; set; }
        [Display(Name = "Last Name:")]
        public string LastName { get; set; }
        [DataType(DataType.EmailAddress)]
        [Display(Name = "e-Mail:")]
        public string eMail { get; set; }
        [DataType(DataType.PhoneNumber)]
        [Display(Name = "Phone #:")]
        public string phone { get; set; }
        public Boolean OptIn { get; set; }
        [Display(Name = "Guest Last Name:")]
        public string GuestLastName { get; set; }
        [Display(Name = "Guest First Name:")]
        public string GuestFirstName { get; set; }
        [DataType(DataType.Currency)]
        public decimal Donation { get; set; }
        public int? Attended { get; set; }

    }
}

对于某些观点,所有这些信息都不是必需的。我想让一个viewmodel只显示名字,姓氏,捐赠,也许加入名字和姓氏。我试图做这样的事情,但它不起作用:

namespace GuestListTemplate.ModelViewModels
{
    public class GuestViewModel
    {
       public string FirstName { get; set; }
       public string LastName { get; set; }
       public decimal Donation {get; set;}
        [Display(Name = "Full Name")]
       public string FullName 
       {
           get { return FirstName + " " + LastName;}      
       }

    }
}

如何告诉MVC使用GUEST模型作为此视图模型的数据源,或者如何将它们绑定在一起? (这个的目的是我认为它可能有助于我的应用程序的性能,它实际上会帮助性能??)。我理解如何使用Viewmodels显示来自多个表的数据并提取所有数据但在这种情况下我想从一个表中仅提取某些数据。最后,这在控制器中更好吗?

我希望这个问题有道理。使用LINQ查询(例如

)会更好吗?
var Guests = db.Guest.Include(g => g.firstname, g.lastname, g.donation);
return (Guests.ToList());

(我知道上面的命令可能不是确切的语法bbut你明白了)。如果这是一种更好的方法,那么有人可以演示使用整个viewmodel代码执行此操作的基本方法。我很喜欢LINQ,所以如果有人提供一个基本的例子,我应该能够使它适用于我的目的。

编辑:

这对我有用(以及下面答案中概述的界面):

ViewModel与上面相同。

以下是我在控制器中所做的事情:

var viewmodel = db.Guests.Select(g => new GuestListIndexData
            {
                ID = g.ID,
                FirstName = g.FirstName,
                LastName = g.LastName,
                Donation = g.Donation,
                Attended = g.Attended
            }).OrderBy(g => g.FirstName);

            return View(viewmodel.ToList());

我的观点基本上与我上面列出的相同。这有效,但我不确定我实际上有多快表现,所以在我使用非常大的数据库之前我可能不会使用它。

1 个答案:

答案 0 :(得分:1)

我能够通过接口实现这一点,例如:

public interface INameEntity
{
   string FirstName { get; set; }

   string LastName { get; set; }
}

并将此添加到访客:

public class Guest : INameEntity

在部分中使用INameEntity:

@model INameEntity

@Html.TextBoxFor(i => i.FirstName)

这是我使用的技术,如果Guest是父视图中的直接模型,它的效果很好。如果有一个父模型类,它可行,但设置稍微复杂一点。