查看模型实现 - 比实体中的字段少

时间:2013-11-29 11:32:00

标签: c# asp.net-mvc entity-framework asp.net-mvc-4 asp.net-mvc-viewmodel

我有两个实体:PersonQuote(一对多关系)

人:

 public class Person
 {
    public int PersonID { get; set; }

    [Required]
    [StringLength(20]
    public string Name { get; set; }

    [StringLength(30]
    public string Relation { get; set; }

    public byte[] Image { get; set; }

    [StringLength(50)]
    public string ImageMimeType { get; set; }

    public virtual ICollection<Quote> Quotes { get; set; }
}

引用:

public class Quote
{
    public int QuoteID { get; set; }

    public int PersonID { get; set; }

    [Required]
    [StringLength(200)]
    public string QuoteName { get; set; }

    [StringLength(400)]
    public string Context { get; set; }

    public DateTime? Date { get; set; }

    public virtual Person Person { get; set; }
}

我想制作一个ViewModel,以短格式显示引号 - 我只需要几个属性 - Person NameQuoteNamePerson Image。我可以做一些随意的事情,就像他们在每个ASP.NET MVC教程中展示一样:

 public class QuoteViewModel
 {
    public IEnumerable<Quote> Quotes { get; set; }
 }

是否有更好的方法而不是使用Quote类型创建IEnumerable并加载所有属性?

如何创建QuoteShort模型并将QuoteViewModel设为IEnumerable<QuoteShort> QuotesShort

在控制器中,我会将每个3个字段从存储库映射到QuoteShort并将其添加到QuotesShort IEnumerable(即使我不知道如何将它们保存到QuotesShort IEnumerable)< / p>

一些例子表示赞赏。

2 个答案:

答案 0 :(得分:2)

您可以使用所需的少数属性创建QuoteShort ViewModel,然后让您的视图期望IEnumerable<QuoteShort>作为其模型。您不必将其包装在另一个容器中。

如果你有这个:

public class QuoteShort{

    public Person Person {get;set;}
    public string Name {get; set;}
    // etc
}

您可以在控制器中执行此操作:

var quotes = //however you get your list of quotes
var model = (from q in quotes select new QuoteShort
                { Person = q.Person, Name = q.Name /*etc*/ }).ToList();

return View(model);

答案 1 :(得分:2)

这样的东西
public class QuotesShortViewModel
{
    public IEnumerable<QuoteShortViewModel> QuotesShort { get; set; }
}

public class QuoteShortViewModel
{
    // ... the properties you need
}

创建一个接收QuotesShortViewModel的View并遍历列表,根据需要呈现简短的引号。

AutoMapper可用于在控制器中的模型和ViewModel之间进行映射。