2015-06-14 74 views
0

这个问题类似于此链接: ViewModel to display partial informationMVC视图模型显示只有模型数据

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

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

    } 
} 

所有这些信息对某些视图来说都不是必须的。我想让一个视图模型只显示名字,姓氏,捐赠,并且可能加入名字和姓氏。我试图做这样的事情,但它不工作:

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你的想法)。如果这是一个更好的方法,那么有人可以用整个视图模型代码演示一个基本的方法。我对LINQ相当不错,所以如果有人提供了一个基本的例子,我应该能够使它适用于我的目的。

编辑:

这为我工作(以及在下面的答案列出的接口):

视图模型是与上面相同。

以下是我在控制器里做:

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

我能够用的接口,如这对实现这一目标:

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

    string LastName { get; set; } 
} 

而这种增加游客:

public class Guest : INameEntity 

而且在局部使用INameEntity:

@model INameEntity 

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

这是我使用的技术,如果Guest是您父级视图中的直接模型,则它非常适用。如果有一个父模型类,它是可行的,但更复杂一点的设置。

+0

我之前没有使用过Interfaces。去尝试一下,看看它是否有效,它仍然可以使用Visual Studio的自动创建Scaffolded视图的能力吗?我会在几分钟内发现 – dave317

+0

对自动处理脚手架视图不起作用 – dave317

+0

忽略我最后的评论。无论我需要自定义视图,我都可以使用界面或视图模型。我希望做到这一点,所以我不必定制视图太多,但这是不可能的。 – dave317