让我们假设我有一篇博客文章的视图,我需要为该视图提出一个视图模型。视图显示
如果这些只是文字元素,我会选择
public PostViewModel
{
public string AuthorName { get; set; }
public DateTime Date { get; set; }
public int NumberOfComments { get; set; }
public IEnumerable<string> Tags { get; set; }
}
但是,如果我想将其中一些作为链接怎么办?点击作者姓名将带我到作者的个人资料,点击评论将带我到评论。现在这突然变得更具挑战性。
我有什么选择?
ActionLink
,同样用于评论(帖子ID)其中只有选项4似乎可行,所以
public ActionViewModel
{
public string Action { get; set; }
public string Controller { get; set; }
public string Text { get; set; }
public RouteValueDictionary RouteValues { get; set; }
}
和PostViewModel
变为
public PostViewModel
{
public ActionViewModel AuthorName { get; set; }
public DateTime Date { get; set; }
public ActionViewModel NumberOfComments { get; set; }
public IEnumerable<ActionViewModel> Tags { get; set; }
}
此时我想知道为什么框架不能支持开箱即用的这种常见场景。我在这里遗漏了什么,或者这确实是要走的路?
编辑:我添加了Tags
属性,以便更清楚地说明为什么我认为选项2有问题。我不能
public IEnumerable<string> Tags { get; set; }
public IEnumerable<int> TagIds { get; set; }
因为标签名称与其ID之间没有安全关联,所以我不得不在这里引入一个对象。
答案 0 :(得分:2)
您只需为帖子ID添加一个属性,为作者ID添加另一个属性,然后使用这些属性。
public PostViewModel
{
public int Id {set;get;}
public int AuthorId { set;get;
public string AuthorName { get; set; }
public DateTime Date { get; set; }
public int NumberOfComments { get; set; }
}
在你看来
@model PostViewModel
<p>Post created by @Html.ActionLink(Model.AuthorName,"Details","User"
,new { id=Model.AuthorId},null)</p>
<p>Total @Html.ActionLink(Model.NumberOfComments,"Comments","Post"
,new { postId =Model.AuthorId},null)</p>
假设您在Usercontroller中有一个Details
操作方法,它接受id
参数和PostController上的Comments操作,该操作接受postId
参数。
如果您已有用户/作者视图模型,则可以用AuthorId
替换AuthorName
和PostViewModel
。{/ p>
编辑:根据问题编辑。
如果您想要一组标签,请为此创建另一个小视图模型 并使用该类型的集合作为您的财产
在这里,我为Author创建了一个视图模型,您需要在Author详细信息页面(来自作者链接)
public class BaseVm
{
public int Id {set;get;}
public string Name { set;get;}
}
public class AuthorVm : BaseVm
{
}
public class TagVm : BaseVm
{
}
public PostViewModel
{
public int Id {set;get;}
public AuthorVm Author { set;get;
public DateTime Date { get; set; }
public int NumberOfComments { get; set; }
public List<TagVm> Tags {set;get;}
public PostViewModel()
{
this.Tags = new List<TagVm>();
this.Author = new AuthorVm();
}
}
现在,在您看来,您应该访问作者ID /名称,如Model.Author.Id