【问题标题】:Using LINQ with C# MVC将 LINQ 与 C# MVC 一起使用
【发布时间】:2016-09-24 15:38:43
【问题描述】:

在我的模型上正确实施 LINQ 时遇到问题。现在我有它,当用户点击“列表曲目”视图时,他们将收到数据库中每首歌曲的列表。我想要做的是在顶部添加另一个链接,例如“流行曲目”,并在用户单击它时拥有它,它将按其 GenreId(流行音乐)为 9 对所有歌曲进行排序。我不确定如何完成此操作,因为我不明白您将如何从 1 index() 方法返回多个视图(如果这就是我会这样做的话?)。任何帮助表示赞赏。

我现在收到此错误:

异常详细信息:AutoMapper.AutoMapperMappingException:缺少类型 映射配置或不支持的映射。

映射类型:流派 -> TrackBase Assignment_3.Models.Genre -> Assignment_3.Controllers.TrackBase

来源错误:

第 74 行:{ 第 75 行:var AllPop = ds.Genres.Where(p => p.GenreId == 9);第 76 行:返回 mapper.Map>(AllPop);第 77 行:} 行 78:

Manager.cs:

 public IEnumerable<TrackBase> TrackGetAll()
    {

        return mapper.Map<IEnumerable<Track>, IEnumerable<TrackBase>>(ds.Tracks);
    }

    public IEnumerable<TrackBase> TrackGetAllPop()
    {
        var AllPop = ds.Genres.Where(p => p.GenreId == 9);
        return mapper.Map<IEnumerable<TrackBase>>(AllPop);
    }

TrackController.cs:

  public ActionResult Index(int? genreid)
    {
        if (genreid.HasValue && genreid.Value == 9)
        {
            return View(m.TrackGetAllPop());
        }

        return View(m.TrackGetAll());

    }

AutoMapperConfig.cs:

  cfg.CreateMap<Models.Track, Controllers.TrackBase>();
            cfg.CreateMap<Controllers.TrackBase, Controllers.TracksController>();

【问题讨论】:

  • 您的方法需要是Index(int? genre),并且您将链接中的流派值作为路由参数传递-@Html.ActionLink("Pop Tracks", "Index", new { genre = 9 })(将评论参考您的last question)。然后它只是var tracks = m.TrackGetAll(); if (genre.HasValue) { tracks = tracks.Where(x =&gt; x.GenreId =genre); } return View(tracks);
  • 现在收到上面这个错误
  • 这与您的问题无关(这是关于将值传递给方法)。您需要花一些时间阅读帮助文件以了解如何使用本网站。

标签: c# asp.net-mvc linq


【解决方案1】:

您需要将流派 id 传递给 Index 操作方法并相应地过滤歌曲。将您的控制器更改为此

public ActionResult Index(int? genreid)
{
    if (genreid.HasValue && genreid.Value == 9)
    {
        // return all pop songs to the view
        return View(m.TrackGetAllPop());
    }

    // return all songs to the view
    return View(m.TrackGetAll());
}

然后在你的索引中

@Html.ActionLink("All Tracks", "Index") |
@Html.ActionLink("Pop Tracks", "Index", new { genreid = 9})

你也有TrackGetAllPop方法的问题

public IEnumerable<TrackBase> TrackGetAllPop()
{
    var AllPop = ds.Genres.Where(p => p.GenreId == 9);
    return mapper.Map<IEnumerable<TrackBase>>(AllPop);
}

上面的方法返回IEnumerable&lt;TrackBase&gt;,但是你是从ds.Genres而不是ds.Tracks查询的,所以这就是你得到错误的原因。假设Track 表有GenreId 作为Genre 表的外键,TrackGetAllPop 方法应该如下所示

public IEnumerable<TrackBase> TrackGetAllPop()
{
    var AllPop = ds.Tracks.Where(p => p.GenreId == 9);
    return mapper.Map<IEnumerable<TrackBase>>(AllPop);
}

更通用的解决方案

以上内容适用于这种特殊情况,但您也可以使其更适用于其他类型。在Manager.cs中添加这个方法

public IEnumerable<TrackBase> TrackGetByGenre(int genreId)
{
    var result = ds.Tracks.Where(p => p.GenreId == genreId);
    return mapper.Map<IEnumerable<TrackBase>>(result);
}

并将您的控制器更改为以下

public ActionResult Index(int? genreid)
{
    if (genreid.HasValue)
    {
        // return songs based on the passed genreid to the view
        return View(m.TrackGetByGenre(genreid.Value));
    }

    // return all songs to the view
    return View(m.TrackGetAll());
}

【讨论】:

  • 查看更新后的答案。你应该在问这个问题之前检查TrackGetAllPop 方法是否正常工作。
猜你喜欢
  • 1970-01-01
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-22
相关资源
最近更新 更多