【问题标题】:how to return Json with a list from other classes?如何使用其他类的列表返回 Json?
【发布时间】:2016-03-21 10:36:49
【问题描述】:

我可以从下面的控制器返回一个列表来查看:

public ActionResult FillSegment(int siteid)
{
    var segment = db.Segment.Where(c => c.SiteID == siteid).Select(x => new
    {
        SegmentID = x.SegmentID, 
        SegmentName = x.SegmentName
    });
    return Json(segment, JsonRequestBehavior.AllowGet);
}

但是如果我想在其他类中进行查询操作,并且我从 FillSegment Action 中调用该类,它应该如何返回?

控制器:

public ActionResult FillSegment(int siteid)
{
    SegmentHelper segmenthelper = new SegmentHelper();      
    return Json(segmenthelper.FillSegment(siteid), JsonRequestBehavior.AllowGet);
}

segmenthelper 类:

public List<string> FillSegment(int siteid)
{
    using (DBConnection db = new DBConnection())
    {
        var segment = db.Segment.Where(c => c.SiteID == siteid).Select(x => new
        {
            SegmentID = x.SegmentID,
            SegmentName = x.SegmentName
        });
        return segment.ToList(); <-- Cannot convert generic list to generic list?
    }
}

【问题讨论】:

  • 您最好使用这两个属性创建一个视图模型(并使用.Select(x =&gt; new SomeModel { ... });)并返回模型的集合。
  • FillSegment的返回类型更改为dynamic(如果助手类和控制器在同一个程序集中)

标签: c# json linq class asp.net-mvc-4


【解决方案1】:

在这种情况下,最好引入 ViewModel 类并返回它。您可能想使用一些映射库。

public class SegmentViewModel
{
    public string SegmentID { get; set; } //not sure if it of string type
    public string SegmentName { get; set; }
}

public IEnumerable<SegmentViewModel> FillSegment(int siteid)
{
    using (DBConnection db = new DBConnection())
    {
        return db.Segment.Where(c => c.SiteID == siteid).Select(x => new SegmentViewModel
        {
            SegmentID = x.SegmentID,
            SegmentName = x.SegmentName
        });
    }
}

// you can also use JsonResult instead of ActionResult
public JsonResult FillSegment(int siteid)
{
    SegmentHelper segmenthelper = new SegmentHelper();      
    return Json(segmenthelper.FillSegment(siteid), JsonRequestBehavior.AllowGet);
}

【讨论】:

    【解决方案2】:

    Select 语句将返回一个匿名对象序列,其属性为SegmentIDSegmentName,它们不能转换为字符串列表。 您必须更改 FillSegment 的返回类型。

    【讨论】:

    • 我可以知道返回类型是什么吗?
    • public List FillSegment(int siteid) 是返回类型。
    • 感谢您的信息,我明天将在办公室试用。
    • 您可以尝试将其更改为List&lt;Segment&gt;,添加类Segment 与道具SegmentIDSegmentName,最后将选择更改为.Select(x =&gt; new Segment { ... }
    【解决方案3】:

    我不是 100% 确定,但我认为这应该可行

    控制器:

         public ActionResult FillSegment(int siteid)
         {
            SegmentHelper segmenthelper = new SegmentHelper();      
            return Json(segmenthelper.FillSegment(siteid), JsonRequestBehavior.AllowGet);
         }
    

    Segmenthelper 类:

        public list<Segment> FillSegment(int siteid)
        {
            using (DBConnection db = new DBConnection())
            {
                var segment = db.Segment.Where(c => c.SiteID == siteid).Select(x => new
            {
                SegmentID = x.SegmentID,
                SegmentName = x.SegmentName
            }).toList();
            return segment;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2020-11-30
      • 2019-10-04
      • 1970-01-01
      • 1970-01-01
      • 2021-02-14
      • 2020-04-24
      • 2021-04-09
      • 2012-01-17
      • 2020-07-14
      相关资源
      最近更新 更多