C# 为我的数据创建MVC视图模型
我对MVC还是个新手,所以我对MVC视图模型的理解是正确的。它们本质上是直接与视图交互的模型,而作为常规模型,它们可能与视图交互,也可能不与视图交互。所以我有两个类UserModel和ArticleModel。显示所有用户信息以及其中一篇文章的描述的最佳方式是什么?我会为此创建一个视图模型吗?我只是创建一个viewmodel来返回UserModel和ArticleModel的实例,还是有更好的方法 我目前的课程:C# 为我的数据创建MVC视图模型,c#,asp.net-mvc,C#,Asp.net Mvc,我对MVC还是个新手,所以我对MVC视图模型的理解是正确的。它们本质上是直接与视图交互的模型,而作为常规模型,它们可能与视图交互,也可能不与视图交互。所以我有两个类UserModel和ArticleModel。显示所有用户信息以及其中一篇文章的描述的最佳方式是什么?我会为此创建一个视图模型吗?我只是创建一个viewmodel来返回UserModel和ArticleModel的实例,还是有更好的方法 我目前的课程: public class UserModel { public int U
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; }
}
通常会创建具有类似结构的类。因此,视图模型是从视图填充的,我们从视图模型手动更新模型
您可以手动将一个属性一个属性地从视图模型复制到另一个模型,或者使用反射或使用像auto mapper这样的API进行复制。通常会创建一个具有类似结构的类。因此,视图模型是从视图填充的,我们从视图模型手动更新模型
您可以手动将一个属性一个属性地从视图模型复制到另一个模型,或者使用反射或使用自动映射器之类的API进行复制。您的想法似乎是正确的。通常,您需要将视图模型传递给视图,尤其是在这样的情况下,您需要来自两个或多个实体模型的数据。在这个网站上,我们经常看到人们通过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; }
}
你可以这样做
但是你会向视图发送多余的数据,这通常会给人们带来问题,因为他们的应用程序范围在扩大你似乎有正确的想法。通常,您需要将视图模型传递给视图,尤其是在这样的情况下,您需要来自两个或多个实体模型的数据。在这个网站上,我们经常看到人们通过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; }
}
你可以这样做
但是,您将向视图发送多余的数据,这通常会给用户带来问题,因为他们的应用程序范围不断扩大您可以创建一个视图模型,该模型包含视图显示数据所需的所有属性和集合,并采用视图所需的正确格式。此视图模型由控制器通过使用UserModel和ArticleModel实例构建。这可能意味着,在视图模型中,您的属性不在模型中,反之亦然 现在在您的情况下,您的模型似乎已经为您的视图设计好了,在这种情况下,您可以在视图模型中使用它们的实例;避免不必要的映射 最重要的规则是,在视图中,应该很容易使用其viewmodel的属性并显示它们,可能应用一些基本格式(例如日期)
根据您提供的信息,我将只使用viewmodel中的现有模型作为属性,因为您可能需要显示所有这些模型,并且可以避免额外的映射。您可以创建一个视图模型,其中包含视图显示数据所需的所有属性和集合,以视图所需的正确格式。此视图模型由控制器通过使用UserModel和ArticleModel实例构建。这可能意味着,在视图模型中,您的属性不在模型中,反之亦然 现在在您的情况下,您的模型似乎已经为您的视图设计好了,在这种情况下,您可以在视图模型中使用它们的实例;避免不必要的映射 最重要的规则是,在视图中,应该很容易使用其viewmodel的属性并显示它们,可能应用一些基本格式(例如日期)
根据您提供的信息,我将仅使用viewmodel中的现有模型作为属性,因为您可能需要显示所有这些模型,并且可以避免额外的映射。需要遵循的一些规则和最佳实践:--
- 所有视图都是强类型的
- 对于每个ViewModel类型,只定义了一个强类型视图
- 视图指示ViewModel的设计。只有渲染视图所需的内容才会随ViewModel一起传入
- ViewModel仅包含与视图相关的数据和行为
- 所有视图都是强类型的
- 对于每个ViewModel类型,只定义了一个强类型视图
- 视图指示ViewModel的设计。只有渲染视图所需的内容才会随ViewModel一起传入
- 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<SubCategory> SubCategories { get; set; }
}
现在,您的视图应该是类型CategoryViewModel
(强类型)
@model IEnumerable
@foreach(模型中的var项目)
{
@item.CategoryName
}
我希望这能给你一个起点。让我知道
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());
}
@model IEnumerable<CategoryViewModel>
@foreach (var item in Model)
{
<h1>@item.CategoryName</h1>
}