2015-06-14 103 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