如何从控制器返回数据列表到淘汰功能查看页面

时间:2016-01-13 09:24:23

标签: asp.net-mvc linq knockout.js

这是我的控制器,我将使用帖子返回标签列表:

  public JsonResult GetPosts(int? id)
    {
        var varid = id;
        var ret = (from post in db.Posts.ToList()
                   orderby post.PostedDate descending
                   select new
                   {
                       CityName = post.City.CityName,
                       TagName = post.Tags.ToList()
                    // TagName = post.Tags
                }
      }

我不知道,在这里,这是返回所有选定标签的方法。 帖子和标签表与包含TagId和PostId的数据库中的连接表TagPost按多对多关系互连。

这是淘汰赛代码:

function Post(data) {
var self = this;
data = data || {};
self.CityName = data.CityName || "";
self.TagName = data.TagName || "";
 }
 function viewModel() {
    var self = this;
    self.posts = ko.observableArray();
    self.newMessage = ko.observable();
    self.error = ko.observable();
   self.loadPosts = function () {
        // to load existing posts
        $.ajax({
            url: postApiUrl1,
            data: { id: $("#Locations").val() },
            datatype: "json",
            contentType: "application/json",
            cache: false,
            type: 'Get'
        })
        .done(function (data) {
            var mappedPosts = $.map(data, function (item)
            { return new Post(item); });
            self.posts(mappedPosts);
        })
        .fail(function () {
            error('unable to load posts');
        });
    }

这是我希望将cityName与标签进行数据绑定的视图页面:

 <div>
   <img src="~/assests/images/icon.png" alt=""><span><a data-bind="text: CityName"></a></span>
 </div>
 <div>
   <img src="~/assests/images/tag.png" alt=""><span><a data-bind="text: TagName"></a></span>
 </div>

在这里,我想用逗号分隔返回所有标签名称。请有人建议我从这里做什么。

这是我的Post课程:

public class Post
{
 [Key]
 public int PostId { get; set; }
 public string Message { get; set; }
 public int? cityId { get; set; }
 public IList<Tag> Tags { get; set; }
 }

这是我的标签类:

  public class Tag
  {
    public int TagId { get; set; }
    public string TagName { get; set; }
    public IList<Post> Posts { get; set; }
  }

标记和帖子类之间存在多对多的关系,因此它创建了一个新的连接表TagPost与列(TagId,PostId)。 这就是我在模型创建时将数据插入此表的方法:

    modelBuilder.Entity<Tag>()
                    .HasMany(p => p.Posts)
                    .WithMany(t => t.Tags)
                    .Map(m =>
                            {
                                m.ToTable("TagPost");
                                m.MapLeftKey("TagId");
                                m.MapRightKey("PostId");
                            });

1 个答案:

答案 0 :(得分:1)

这应该以您想要的格式提供数据:

var data = db.Posts.Include(x => x.Tags)
                   .Include(x => x.City)
                   .Where(x => x.PostId == id)
                   .SingleOrDefault();

var json = new {

    PostId = data.PostId,
    PostMessage = data.Message,
    CityName = data.City.CityName,                
    Tags = string.Join(",", data.Tags.Select(t => t.TagName))                
};

return Json(json, JsonRequestBehavior.AllowGet);

这将返回以下Json:

{
    "PostId": 1,
    "PostMessage": "ABC",
    "CityName": "Chicago",
    "Tags": "C#,.NET,StackOverflow"
}

请注意,我已在Include中使用Post包含了城市,但在您发布的模型中,只有cityId。也许你也需要改变它。

修改

根据请求,要返回所有帖子和相关标签,请将代码更改为:

var data = db.Posts.Include(x => x.Tags)
                   .Include(x => x.City)
                   .ToList();

if (data.Count == 0)
    return null; //Just return something if no post is found

var json = data.Select(x => new 
{
    PostId = x.PostId,
    PostMessage = x.Message,
    CityName = x.City.CityName, 
    Tags = string.Join(",", x.Tags.Select(t => t.TagName))

}).ToList();