【问题标题】:Pass two values to view?传递两个值来查看?
【发布时间】:2011-07-27 17:13:28
【问题描述】:

我有一个查询,我需要在其中获取帖子 + 它拥有的每个标签。但是由于标签在单独的表格中,这让我感到很困难,原因有两个。我不确定我什至需要传递两个值,也许我可以以不同的方式做到这一点。

请注意,模型是使用 LINQ to SQL 类自动创建的。


数据库

代码

public ActionResult Edit(int id)
{
    // Get post from DB
    var post = (from p in _db.Posts
                where p.ID == id
                select p).Single();

    // Get PostTags from DB
    var postTag = (from pt in _db.PostTags
                   where pt.PostID == id
                   select pt);

    // Now looping through PostTags in order to find all tag names associated with the post
    string tagList = string.Empty;
    foreach (var pt in postTag)
    {
        var tag = (from t in _db.Tags
                   where t.ID == pt.TagID
                   select t).Single();
        tagList += tag.Name + " ";
    }
    return Content(tagList); // This works as intended, outputs all tags for current post

    return View(); // How can I return post itself + tagList ?
}

问题

  1. 如您所见,我想将post 传递给我的视图,这是有道理的,但我还需要以某种方式传递包含标签的tagList 字符串。我该怎么做?

  2. 我认为我的查询不好。我没有使用 SQL/LINQ 的经验,所以这是我唯一想到的。也许我可以更“聪明”地做同样的事情?

好的,谢谢你的回答。 ViewBag 和创建 BlogViewModel 都很好。我想我会选择 BlogViewModel 。但是我的第二个问题仍然存在。

【问题讨论】:

    标签: c# asp.net linq linq-to-sql asp.net-mvc-3


    【解决方案1】:

    您是否考虑过创建一个包含这两个对象的 ViewModel,并将该 ViewModel 传递给您的 View?您还可以使用 LINQ 来改进您的查询。

    (注意:我是通过手机发布的,因此语法可能会关闭)

    型号:

    public class TaggingModel
    {
       public string TagList {get; set;}
       public PostClass Post {get; set;}
    }
    
    public TaggingModel(string tagList, Post post)
    {
        this.TagList = tagList;
        this.YourPost = post;
    }
    

    代码(使用 LINQ):

    var post = _db.Posts.Where(pt => pt.PostID == id).Single();
    var postTags = post.PostTags.Where(pt => pt.PostID == id);
    
    string tagList = string.Empty;
    
    foreach(var pt in postTags)
    {
         var tag = _db.Tags.Where(t => t.ID == pt.TagID).Single(); 
         tagList += tag.Name + " ";
    }
    
    TaggingModel model = new TaggingModel(tagList, post);
    
    return View(model);
    

    如果您不想为其实现模型,您还可以使用其他方法来发送消息,例如将它们存储在 ViewData 中。

    【讨论】:

      【解决方案2】:

      您可以使用 ViewBag 动态对象或 ViewData 传递一个项目,使用第二个项目作为模型到视图。你也可以定义一个视图模型类,或者使用一个元组

      ViewData["tags"] = tagsList;
      return View(post);
      

      或者如果您不想创建视图模型但仍想要强类型视图

      return View(Tuple.Create(post, tagsList));
      

      【讨论】:

      • 如何在我的视图中使用 Tuple 方法访问 tagList?
      • Tuple 类具有 Item1、Item2、Item3 等属性名称,具体取决于属性计数。假设您在视图中有像 Tuple 这样的模型,您可以使用 Model.Item2 访问 tagsList
      【解决方案3】:

      定义一个 View Model 类,该类具有 post 属性和 tagList 属性,并将其传递给 View() 的调用。

      【讨论】:

        【解决方案4】:

        我更喜欢创建一个包含两个不同对象和属性的模型:

        public class EditPageModel()
        {
            public PostClass Post (get; set;}
            public string TagList {get; set;}
        }
        

        然后返回:

        return View (new EditPageModel(){Post = post, TagList = tagList});
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-23
          • 2021-12-05
          • 2016-01-01
          • 1970-01-01
          相关资源
          最近更新 更多