我无法理解和实现视图模型。例如,假设我有一个 Blog 对象,其中每个 Blog 对象代表一篇博客文章。我有一个包含每个博客列表(标题、文本、发布日期等)的视图。目前我将博客对象列表传递给视图,但我宁愿将 BlogViewModel 对象列表传递给视图。我该怎么做?有没有人有任何好的资源可以帮助我理解视图模型?
编辑 我要传递的 BlogViewModel 将包含博客标题和文本的缩写字段。例如,我只想显示标题的前 10 个字符和文本的前 25 个字符。
我无法理解和实现视图模型。例如,假设我有一个 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 回一个完整的对象,他们可能会向您发送您可能不期望的更新字段。如果您使用虚拟机,您可以控制您将接受哪些信息。
我发现构建视图更容易/更快