【问题标题】:How to bind custom model class in mvc如何在 mvc 中绑定自定义模型类
【发布时间】:2015-11-09 13:35:53
【问题描述】:

我是 MVC 的新手。我正在做一个项目,在该项目中我创建了一个模型类和上下文类,如果我在普通视图中查看记录,它工作得很好。 但是,如果我尝试按“Series_Name”获取分组中的数据并将其绑定到同一模型类中,则会出现错误。这是我的代码

这里是模型类和 DBContextClass

[Table("tblvideo")]
public class TVSerial
{
    [Key]
    public Int64 Video_ID { get; set; }
    public string Series_Name { get; set; }
    public string Season_No { get; set; }
    public string Episode_No { get; set; }
    public string Episode_Name { get; set; }
    public string Time_Duration { get; set; }
    public string File_Url_480p { get; set; }
    public string File_Url_720p { get; set; }
    public string Description { get; set; }
    public bool Is_Active { get; set; }
    public string Image_Url_Small { get; set; }
    public string Image_Url_Big { get; set; }   
} 

public class TvSerialContext : DbContext
{
    public DbSet<TVSerial> TvSerials { get; set; }
}

这是控制器类:

public class TvSerialController : Controller
{
    public ActionResult ListAllTvSerial()
    {
        try
        {
            TvSerialContext tvContext = new TvSerialContext();
            List<TVSerial> tv = tvContext.TvSerials.ToList();
            return View(tv);
        }
        catch (Exception ex)
        {
            return Content(ex.Message);
        }
    }
}

以上代码按预期工作,但如果我这样做:

public ActionResult ListAllSeason(string serial)
{
    try
    {
        TvSerialContext tvContext = new TvSerialContext();
        List<TVSerial> tv = tvContext.TvSerials.Where(tvs => tvs.Series_Name == serial).Distinct().ToList();
        return View(tv);
    }
    catch (Exception ex)
    {
        return Content(ex.Message);
    }
}

它返回所有行,我只想从每个 series_name 和自定义字段“Series_Name,Season_No,Image_Url_Big”中获取单行 我不知道如何做到这一点。 得到结果:

预期结果:-

【问题讨论】:

  • 什么意思返回所有行?它只会返回Series_Name == serial 所在的行。你有自定义的比较器吗? (如果不是 .Distinct() 子句不会做任何事情。最好的猜测是你想要一个 .GroupBy() 但从你的问题中不清楚你想要输出是什么。
  • 是的,实际上我想要 groupBy Series_Name 并且只想要 3 个字段,但我不知道如何实现这一点。
  • 创建一个仅包含 3 个您想要的属性的视图模型,并使用 .GroupBy() 将 vales 投影到您的视图模型中。但是你打电话给你的方法ListAllSeason暗示你想按季节分组?
  • 是的,当我传递参数 ex 时是正确的:- Series_Name ="Breaking Bad" 它应该返回 All season_No 像 1,2,3,4,5。所以正如你所说,我需要另一个模型来处理 3 个属性,然后还需要另一个 DbContext 吗?
  • 不,只是您将 3 个属性值投影到的视图模型。我建议您编辑您的问题以显示您想要返回的数据样本,以便清楚您想要做什么以及如何对数据进行分组。

标签: asp.net-mvc-4


【解决方案1】:

您可以通过创建视图模型并使用.GroupBy() 子句来做到这一点

public class TVSerialVM
{
  public string SeriesName { get; set; }
  public string SeasonNo { get; set; }
  public string ImageUrl { get; set; } 
}

以及投影到您的视图模型中的查询

List<TVSerialVM> model = tvContext.TvSerials.Where(t => t.Series_Name == serial)
  .GroupBy(t => new { t.Series_Name, t.Season_No, t.Image_Url_Big })
  .Select(t => new TVSerialVM
  {
    SeriesName = t.Key.Series_Name,
    SeasonNo = t.Key.Season_No,
    ImageUrl = t.Key.Image_Url_Big
  }).ToList();

旁注:您在数据库中的重复数据(季号和图片网址)。您应该考虑将图像 url 移动到与季节编号相关的另一个表中。

【讨论】:

    【解决方案2】:

    即使您使用 distinct 也获得多个值的原因是 Distinct 方法不知道 TVSerial 的“相等”是什么。

    您可以将 Distinct 与 IEqualityComparer 一起使用。 https://msdn.microsoft.com/en-us/library/vstudio/bb338049(v=vs.100).aspx

    【讨论】:

    • 实际上我想要 groupBy Series_Name 并且只想要 3 个字段,但我不知道如何实现这一点。
    【解决方案3】:

    不保证对不知道要比较什么的自定义对象有不同。我过去曾使用此 SO 使我的自定义对象与 Distinct 一起使用。

    Creating a distinct list of custom type in C#

    【讨论】:

    • 实际上我想要 .GroupBy Series_Name 并且只想要 3 个字段,但我不知道如何实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多