使用数据库查看模型



我在理解和实现视图模型方面有困难。例如,假设我有一个Blog对象,其中每个Blog对象表示一篇博客文章。我有一个视图,其中包含每个博客的列表(标题、文本、发布日期等)。目前,我正在向视图传递一个博客对象列表,但我更愿意向视图传递一个BlogViewModel对象列表。我该怎么做呢?有人有什么好的资源可以帮助我理解视图模型吗?

编辑我想传递的BlogViewModel将包含博客标题和文本的缩写字段。例如,我只想显示标题的前10个字符和文本的前25个字符。

假设您当前正在做如下操作:

public ActionResult GetBlogs()
{
    var someService = new FooService();
    var blogs = someService.GetMeMyBlogs();
    return View("bloglist", blogs); 
}

要使用视图模型,你需要从你的服务中返回它们,或者在将对象发送到视图之前转换控制器中的对象。

一个选项是为Blog对象创建一个扩展方法。

假设我们有一些属性,比如:

public class BlogVM
{
    public string Title {get;set;}
    public string Body {get;set;}
    public string AuthorName {get;set;}
    public int Id {get;set;}
}

我们可以写一个扩展方法:

public static BlogVM ToBlogVM(this Blog source)
{
    return new BlogVM 
    {
         Title = source.Title.SubString(0, 10),
         Body = source.Body.SubString(0, 25),
         AuthorName = source.Author.Name,//assuming you have some kind of Author table, I'm sure you get the idea..
         Id = source.Id
    };
}

现在你可以在控制器中输入

public ActionResult GetBlogs()
{
    var someService = new FooService();
    var blogs = someService.GetMeMyBlogs();
    return View("bloglist", blogs.Select(x => x.ToBlogVM())); 
}

传递一个BlogVM对象列表到你的视图。

编辑:可能值得在为什么 ViewModels上加几句话。

  • 如果视图不需要,为什么要发送所有内容?在您的示例中,您的主体可能是一大块文本。如果你只打算显示25个字符,只发送25个字符

  • 对象中的某些信息可能是敏感的。你可能想发送Author的名字,但肯定不会发送你可能掌握的其他信息,如他的姓名,电子邮件,甚至密码或地址。

  • 类似地,在POST场景中,您可以控制哪些信息可能被发送回给您。如果您允许用户POST回一个完整的对象,他们可能会向您发回您可能意想不到的更新字段。如果您使用虚拟机,您可以控制接收的信息

  • 我发现它更容易/更快建立视图

相关内容

  • 没有找到相关文章

最新更新