【发布时间】:2016-01-19 05:35:50
【问题描述】:
这是我的控制器:
public JsonResult PostFunction(Post post,IEnumerable<int> MultipleTags)
{
post.PostedBy = User.Identity.GetUserId<int>();
post.PostedDate = DateTime.UtcNow;
foreach (var tagId in MultipleTags)
{
var tag = new Tag { TagId = tagId };
db.Tags.Attach(tag); // this avoids duplicate tags
post.Tags.Add(tag);
}
db.Posts.Add(post);
db.SaveChanges();
var usr = db.Users.FirstOrDefault(x => x.Id == post.PostedBy);
{
Message = post.Message,
// here, i am getting nothing but it should return back tagnames
TagName = string.Join(",", post.Tags.Select(t => t.TagName)),
PostedBy = post.PostedBy,
PostedByName = post.ApplicationUser.UserName,
};
return Json( ret,JsonRequestBehavior.AllowGet);
}
然而,数据被正确地插入到数据库中,但是这个 ret var 给出了 System.NullReferenceException。导致问题的行是 TagName,它应该返回逗号分隔值。
如果我尝试这样的事情,那么它工作正常,但它不会返回最后插入的帖子。表示如果在数据库中,已经有 7 个帖子,并且在这个新插入之后,总共没有。帖子的数量增加到 8 个,因此它应该返回全部 8 个,但它只返回 7 个帖子,不包括最新添加的帖子。
var ret = from data in db.Posts.Include(x=> x.Tags)
.OrderByDescending(x => x.PostedDate).ToList()
select new
{
TagName = string.Join(",", data.Tags.Select(t => t.TagName)),
现在,我应该如何修改这个匿名函数,以便它可以动态附加与每个帖子相关的标签。
实际上,有一个带有多选下拉菜单的文本框。文本框和下拉列表中的所有值都转到此控制器,但在提交按钮之后,应将最新提交的帖子添加到页面中。但是这个匿名函数导致错误。它应该将正确的数据传递给敲除绑定,但代码卡在这里。我确定这里与敲除无关。
我还尝试将一个包含所有选定标签的变量放在一个变量中,然后将其分配给 TagName,如下所示:
var result = post.Tags.SelectMany(e => e.TagName);
// and in ret var,
TagName = string.Join(",", result)
但仍然收到 NullReferenceException。 请建议我应该在这里尝试什么。
【问题讨论】:
-
您已将一组新的
Tag添加到Post,但只设置了TagId属性,而不是TagName属性,因此post.Tags.Select(t => t.TagName)不会返回任何值。 -
好的,很好,我已经添加了 tagId 以添加回数据库,但我想要返回 tagName 所以我应该创建一个新变量并将 tagname 存储在那里然后访问它,我已经尝试过但没有得到它完成了。如果我说得对,那该怎么做。如果我错了,那么任何其他方式来取回标记名@StephenMuecke
-
我最后在问题中添加了我如何尝试将标签名放入变量中然后尝试传递给匿名函数,请看看@StephenMuecke先生
-
尝试执行查询并查看结果: var result = post.Tags.SelectMany(e => e.TagName).ToList();
-
您的
PostFunction方法甚至无法编译。你能解决这个问题吗?
标签: c# asp.net-mvc entity-framework linq anonymous-function