为我的数据创建MVC ViewModels

我仍然是这个MVC的新手,所以我的理解在MVC View Models方面是正确的。 它们本质上是与视图直接交互的模型,而常规模型可能会或可能不会与视图交互。 所以我有两个类UserModel和ArticleModel。 显示所有用户信息的最佳方式是什么,加上其中一篇文章的描述,我会为此创建一个视图模型? 我只是创建一个返回UserModel和ArticleModel实例的viewmodel,还是有更好的方法?

我目前的课程:

public class UserModel { public int UserId { get; set; } public String FirstName { get; set; } public String LastName { get; set; } public DateTime CreatedDate { get; set; } } public class ArticleModel { public int ArticleId { get; set; } public String Title { get; set; } public String Description { get; set; } public DateTime AddDate { get; set; } } 

你似乎有正确的想法。 通常,您需要将视图模型传递给视图,尤其是在需要来自两个或更多实体模型的数据的情况下。 在这个网站上,我们经常看到人们通过ViewBag或ViewData发送实体模型和其他一些数据,并且不可避免地,他们的问题的解决方案是使用视图模型。

视图模型可能如下所示:

 public class ViewModel { public int UserId { get; set; } public String FirstName { get; set; } public String LastName { get; set; } public DateTime CreatedDate { get; set; } public String Description { get; set; } } 

此展平版本对于在视图模型级别而不是实体模型级别添加数据注释很有用。 当您可能想要在一个视图中需要字段而在另一个视图中不需要字段时很方便。

或者像这样

 public class ViewModel { public UserModel UserModel { get; set; } public String Description { get; set; } } 

可以做到这一点

 public class ViewModel { public UserModel UserModel { get; set; } public ArticleModel ArticleModel { get; set; } } 

但随后你会向视图发送多余的数据,因为他们的应用程序在范围内增长,这通常会给人们带来问题

要遵循的规则和最佳做法很少: –

  • 所有视图都是强类型的
  • 对于每个ViewModel类型,只定义了一个强类型视图
  • View支配ViewModel的设计。 只有使用ViewModel传递渲染视图所需的内容。
  • ViewModel仅包含与View相关的数据和行为

通常,使用视图模型是一种很好的做法。 使用它们有几个好处。 我认为viewmodel的很多细节,你可以在互联网和堆栈溢出上找到。
因此,让我举一个例子或一个起点
假设我们有一个viewmodel;

 public class CategoryViewModel { [Key] public int CategoryId { get; set; } [Required(ErrorMessage="* required")] [Display(Name="Name")] public string CategoryName { get; set; } [Display(Name = "Description")] public string CategoryDescription { get; set; } public ICollection SubCategories { get; set; } } 

现在,如果您想在存储库项目中使用它。 你可以做这样的事;

 public List GetAllCategories() { using (var db =new Entities()) { var categoriesList = db .Categories .Select(c => new CategoryViewModel() { CategoryId = c.CategoryId, CategoryName = c.Name, CategoryDescription = c.Description }); return categoriesList.ToList(); }; } 

如你看到的。 在viewmodel的情况下,您需要使用投影(因为我已将我的实体投影到viewmodel)。
现在,在您的控制器中,您可以轻松访问它们并将其传递给视图本身;

 ICategoryRepository _catRepo; public CategoryController(ICategoryRepository catRepo) { //note that i have also used the dependancy injection. so i'm skiping that _catRepo = catRepo; } public ActionResult Index() { //ViewBag.CategoriesList = _catRepo.GetAllCategories(); or return View(_catRepo.GetAllCategories()); } 

现在,您的视图应该是CategoryViewModel类型(强类型)

 @model IEnumerable @foreach (var item in Model) { 

@item.CategoryName

}

我希望这能为你提供一个起点。 让我知道,如果你需要我更多:D

通常,正在创建具有类似结构的类。 因此,从视图中填充视图模型,并从视图模型中手动更新模型。

您可以手动将属性从视图模型复制到模型或使用reflection复制或使用自动映射器等API。

您可以创建一个视图模型,其中包含视图显示数据所需的所有属性和集合,视图所需的格式正确。 此视图模型由您的控制器通过使用UserModel和ArticleModel实例构建。 这可能意味着在视图模型中,您具有不在模型中的属性,反之亦然。

现在,在您的情况下,您的模型看起来已经为您的视图设计了,在这种情况下,您可以在视图模型中使用它们的实例; 避免不必要的映射。

最重要的规则是,从视图中可以很容易地使用其视图模型的属性并显示它们,可能应用一些基本格式(例如日期)。

根据您提供的信息,我只会将您的viewmodel中的现有模型用作属性,因为您可能需要显示所有模型并避免其他映射。