0

我无法理解和实现视图模型。例如,假设我有一个 Blog 对象,其中每个 Blog 对象代表一篇博客文章。我有一个包含每个博客列表(标题、文本、发布日期等)的视图。目前我将博客对象列表传递给视图,但我宁愿将 BlogViewModel 对象列表传递给视图。我该怎么做?有没有人有任何好的资源可以帮助我理解视图模型?

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

4

1 回答 1

2

假设您当前正在执行以下操作:

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 回一个完整的对象,他们可能会向您发送您可能不期望的更新字段。如果您使用虚拟机,您可以控制您将接受哪些信息。

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

于 2013-03-08T23:21:34.687 回答