为我的数据创建MVC ViewModels

时间:2013-03-15 12:17:02

标签: c# asp.net-mvc

我仍然对这个MVC事物不熟悉,因此我对MVC视图模型的理解是正确的。它们本质上是与视图直接交互的模型,而常规模型可能会或可能不会与视图交互。所以我有两个类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; }
}

5 个答案:

答案 0 :(得分: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; }
}

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

答案 1 :(得分:2)

很少有规则&要遵循的最佳做法: -

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

答案 2 :(得分:2)

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

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

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>();
    };
 }
你可以看到。在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<CategoryViewModel>
@foreach (var item in Model)
{
    <h1>@item.CategoryName</h1>
}

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

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

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