MVC Viewmodel 仅显示模型数据
MVC Viewmodel to display only model data
此问题与此类似link:
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; }
}
}
某些视图不需要所有这些信息。我想制作一个视图模型以仅显示名字、姓氏、捐赠,并可能加入名字和姓氏。我正在尝试做这样的事情,但它不起作用:
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 显示来自多个 table 的数据并提取所有数据,但在这种情况下,我只想从一个 table 中提取某些数据。最后,这个在controller里面是不是比较好实现?
我希望这个问题是有道理的。使用
之类的 LINQ 查询会更好吗?
var Guests = db.Guest.Include(g => g.firstname, g.lastname, g.donation);
return (Guests.ToList());
(我知道上面的命令可能不是准确的语法,但你明白了)。如果这是一种更好的方法,那么有人可以用整个视图模型代码演示一种基本的方法。我非常擅长使用 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());
我的看法和我上面所列的基本上是一样的。这行得通,但我不确定我实际上从中获得了多快的性能,所以我可能不会使用它,直到我使用非常大的数据库。
我能够通过接口实现这一点,例如:
public interface INameEntity
{
string FirstName { get; set; }
string LastName { get; set; }
}
并将此添加到访客:
public class Guest : INameEntity
并在部分中使用 INameEntity:
@model INameEntity
@Html.TextBoxFor(i => i.FirstName)
这是我使用的技术,如果 Guest 是您在父视图中的直接模型,它会非常有效。如果有父模型 class,它是可行的,但设置稍微复杂一些。
此问题与此类似link: 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; }
}
}
某些视图不需要所有这些信息。我想制作一个视图模型以仅显示名字、姓氏、捐赠,并可能加入名字和姓氏。我正在尝试做这样的事情,但它不起作用:
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 显示来自多个 table 的数据并提取所有数据,但在这种情况下,我只想从一个 table 中提取某些数据。最后,这个在controller里面是不是比较好实现?
我希望这个问题是有道理的。使用
之类的 LINQ 查询会更好吗?var Guests = db.Guest.Include(g => g.firstname, g.lastname, g.donation);
return (Guests.ToList());
(我知道上面的命令可能不是准确的语法,但你明白了)。如果这是一种更好的方法,那么有人可以用整个视图模型代码演示一种基本的方法。我非常擅长使用 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());
我的看法和我上面所列的基本上是一样的。这行得通,但我不确定我实际上从中获得了多快的性能,所以我可能不会使用它,直到我使用非常大的数据库。
我能够通过接口实现这一点,例如:
public interface INameEntity
{
string FirstName { get; set; }
string LastName { get; set; }
}
并将此添加到访客:
public class Guest : INameEntity
并在部分中使用 INameEntity:
@model INameEntity
@Html.TextBoxFor(i => i.FirstName)
这是我使用的技术,如果 Guest 是您在父视图中的直接模型,它会非常有效。如果有父模型 class,它是可行的,但设置稍微复杂一些。