我在理解和实现视图模型方面有困难。例如,假设我有一个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回一个完整的对象,他们可能会向您发回您可能意想不到的更新字段。如果您使用虚拟机,您可以控制接收的信息
我发现它更容易/更快建立视图