【问题标题】:how to pass list of tags to anonymous function如何将标签列表传递给匿名函数
【发布时间】: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 =&gt; 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


【解决方案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);
            }

【讨论】:

  • TagName = db.Tags.FirstOrDefault(x => x.TagName.Where(x => x.TagId == tagId)) 这样的东西应该可以工作,但是方法不给 TagId 选择在这一点(x => x。)我应该尝试什么,你想建议什么@jvanrhyn
  • 您希望在 TagName 中看到什么?
  • 在 tagName 中,仅所有选定的标签,此处每个循环中的 tagId 仅返回这些标签的 id 并将其添加回 post 对象。对于每个循环,链接 Post 和 Tag 的多对多表都填充了 PostId 和 TagId。任何额外需要的请问我我知道我错过了一些代码@jvanrhyn
  • 让我们试试这个。将此var tag = new Tag { TagId = tagId }; 更改为此var tag = new Tag { TagId = tagId, TagName = tagId.ToString() };,看看会发生什么
猜你喜欢
  • 2020-04-10
  • 1970-01-01
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多