我有一个查询,我需要发布它的每个标签。但由于标签位于单独的表格中,因此有两个原因使我难以接受。我不确定我是否需要传递两个值,也许我可以用不同的方式做到这一点。
请注意,使用LINQ to SQL Classes自动创建Model。
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 ?
}
正如您所看到的,我想将post
传递给我的视图,这很有道理,但我还需要以某种方式传递包含标签的tagList
字符串。我怎么能这样做?
我认为我的查询很糟糕。我对SQL / LINQ没有经验,所以这是我想出的唯一一件事。也许我可以做同样的事情“更聪明”?
答案 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});