传递两个值来查看?

时间:2011-07-27 17:13:28

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

我有一个查询,我需要发布它的每个标签。但由于标签位于单独的表格中,因此有两个原因使我难以接受。我不确定我是否需要传递两个值,也许我可以用不同的方式做到这一点。

请注意,使用LINQ to SQL Classes自动创建Model。


DB

enter image description here

代码

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没有经验,所以这是我想出的唯一一件事。也许我可以做同样的事情“更聪明”?

  3. 哦,谢谢你的回答。 ViewBag和创建BlogViewModel都很好。我想我会使用BlogViewModel。但我的第二个问题仍然存在。

4 个答案:

答案 0 :(得分:3)

您是否考虑过创建一个可以容纳这两个对象并将ViewModel传递给View的ViewModel?您还可以使用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中。

答案 1 :(得分:2)

您可以使用ViewBag动态对象或ViewData传递一个项目,将第二个项目用作视图的模型。您还可以定义viewmodel类,或使用Tuple

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

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

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

答案 2 :(得分:1)

定义一个View Model类,它具有post的属性和tagList的属性,并在调用View()时传递它。

答案 3 :(得分:0)

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

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

然后返回:

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