【问题标题】:MVC Viewmodel to display only model dataMVC Viewmodel 仅显示模型数据
【发布时间】:2015-06-14 19:22:01
【问题描述】:

这个问题类似于这个链接: 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 显示来自多个表的数据并提取所有数据,但在这种情况下,我只想从一个表中提取某些数据。最后,这在控制器中是否更好地完成?

我希望这个问题有意义。使用 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());

我的观点与我上面列出的基本相同。这行得通,但我不确定我实际上从中获得了多快的性能,所以在我使用非常大的数据库之前我可能不会使用它。

【问题讨论】:

    标签: asp.net-mvc linq viewmodel


    【解决方案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 是您在父视图中的直接模型,它会非常有用。如果有父模型类,也是可行的,但设置要复杂一些。

    【讨论】:

    • 我以前没有使用过接口。打算尝试一下,看看它是否有效,它是否仍然适用于使用 Visual Studio 自动创建脚手架视图的能力?我会在几分钟内找出答案
    • 忽略我最后的评论。我可以使用界面或视图模型,无论我必须自定义我的视图。我希望能够做到,这样我就不必过多地自定义视图,但这是不可能的。
    • 不幸的是,自定义是唯一的选择
    猜你喜欢
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多