0

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

我目前的课程:

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; }
}
4

5 回答 5

2

你似乎有正确的想法。通常,您会希望将视图模型传递给您的视图,尤其是在这种需要来自两个或多个实体模型的数据的情况下。在这个站点上,我们经常看到人们通过 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; }
}

但是你会向视图发送多余的数据,随着他们的应用程序范围的扩大,这通常会给人们带来问题

于 2013-03-15T12:19:59.503 回答
2

需要遵循的一些规则和最佳实践:-

  • 所有视图都是强类型的
  • 对于每个 ViewModel 类型,都定义了一个强类型视图
  • View 决定了 ViewModel 的设计。只有渲染视图所需的内容才会通过 ViewModel 传入。
  • ViewModel 仅包含与 View 相关的数据和行为
于 2013-03-15T12:22:41.857 回答
2

通常,使用视图模型是一种很好的做法。使用它们有几个优点。我认为 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; }
}

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

public List<CategoryViewModel> 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<CategoryViewModel>();
    };
 }

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

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<CategoryViewModel>
@foreach (var item in Model)
{
    <h1>@item.CategoryName</h1>
}

我希望这能给你一个起点。如果您需要我提供更多信息,请告诉我:D

于 2013-03-15T15:22:19.587 回答
0

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

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

于 2013-03-15T12:19:26.223 回答
0

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

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

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

根据您提供的信息,我只会将您的视图模型中的现有模型用作属性,因为您可能需要显示所有这些模型并且避免额外的映射。

于 2013-03-15T12:22:08.327 回答