如何将标签列表传递给匿名函数

时间:2016-01-19 05:35:50

标签: c# asp.net-mvc entity-framework linq anonymous-function

这是我的控制者:

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个帖子,并且在此新插入之后,则总数为。 post的数量增加到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。 请建议我在这里尝试一下。

1 个答案:

答案 0 :(得分:1)

您必须在创建标记的位置设置TagName的值:

 foreach (var tagId in MultipleTags)
            {
                var tag = new Tag { TagId = tagId, TagName = "something" };
                db.Tags.Attach(tag); // this avoids duplicate tags
                post.Tags.Add(tag);
            }