如何在ASP.NET MVC(Core)中的视图模型中传递链接的数据

时间:2016-08-13 19:18:09

标签: asp.net-mvc asp.net-core asp.net-mvc-viewmodel

让我们假设我有一篇博客文章的视图,我需要为该视图提出一个视图模型。视图显示

  • 作者姓名
  • 日期
  • 评论数量
  • 标签

如果这些只是文字元素,我会选择

public PostViewModel
{
   public string AuthorName { get; set; }
   public DateTime Date { get; set; }
   public int NumberOfComments { get; set; }
   public IEnumerable<string> Tags { get; set; }
}

但是,如果我想将其中一些作为链接怎么办?点击作者姓名将带我到作者的个人资料,点击评论将带我到评论。现在这突然变得更具挑战性。

我有什么选择?

  1. 传递实际(域)模型,而不仅仅是字符串和数字
  2. 传递作者的ID,以便在视图中创建ActionLink,同样用于评论(帖子ID)
  3. 为作者创建视图模型并传递该模型而不是域模型
  4. 为链接创建视图模型,并在视图中使用该链接时使用该链接
  5. 其中只有选项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之间没有安全关联,所以我不得不在这里引入一个对象。

1 个答案:

答案 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替换AuthorNamePostViewModel。{/ 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