如何从MVC Razor中的两个表返回带有外连接的视图

时间:2016-12-14 16:58:38

标签: c# mysql asp.net-mvc asp.net-mvc-4 razor

我的项目中有两个表格作为模型,如: -

public partial class TblAlbum
{
    public int ID { get; set; }
    public string Album { get; set; }
    public string Artists { get; set; }
    public Nullable<int> AudioID { get; set; }
    public Nullable<int> VideoID { get; set; }

    public virtual TblVideo TblVideo { get; set; }
    public virtual TblAudio TblAudio { get; set; }
}

public partial class TblAudio
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Alt { get; set; }
    public string Artist { get; set; }
    public string Image { get; set; }
    public int LangID { get; set; }

    public virtual TblLanguage TblLanguage { get; set; }
    public virtual ICollection<TblAlbum> TblAlbums { get; set; }
}

现在我已将ViewModel设为 GetDetailsVM ,可以访问这两个表,并且 LINQ查询 为: -

public class GetDetailsVM
{
    private MusicEntities db = new MusicEntities();

    public IEnumerable<dynamic> GetAudio()
    {
        var AudioList = from au in db.TblAudios
                        join al in db.TblAlbums on au.ID equals al.AudioID into ar
                        from al in ar.DefaultIfEmpty()
                        select new { au,al };

        return AudioList.ToList();

    }
}

我的ViewModel(AudioAlbumVM)读取Getaudio()应该是这样的: -

public class AudioAlbumVM
{
    public IEnumerable<dynamic> AudioObjList { get; set; }
    public string AlbumName { get; set; }
}

现在我想在我的控制器中访问此ViewModel,然后在我的cshtml中使用它。

我的控制器: -

public ActionResult Audio() 
{
    ViewBag.Title = "Audio";

    var AudioSummary = new GetDetailsVM();
    var viewModel = new AudioAlbumVM
    {
        AudioObjList = AudioSummary.GetAudio().First()
    };

    return View(viewModel);
}

更新
我的视图(Audio.cshtml)如下: -

@model GarhwalMusic.Model‌​s.AudioAlbumVM.AudioObjList

 <a class="art" href="single.html"> @Model.AudioObjList</a>

我正在经历这个问题LINQ left join only works in the ActionResult,但我完全迷失了。需要帮助和解释如何使用另一个ViewModel(GetDetailsVM)创建AudioAlbumVM然后在控制器中,然后在cshtml 。非常感谢任何帮助!!

1 个答案:

答案 0 :(得分:0)

从您的评论中获取此信息

  

现在我收到此错误: - 传入字典的模型项的类型为'GarhwalMusic.Models.AudioAlbumVM',但此字典需要类型为'System.Collections.Generic.IEnumerable`1的模型项[ GarhwalMusic.Model s.AudioAlbumVM]”。

问题在于此代码

    var viewModel = new AudioAlbumVM //its a single model
    {
        AudioObjList = AudioSummary.GetAudio().First()
    };

但似乎您的观点期望model类型IEnumerable<GarhwalMusic.Model‌​s.AudioAlbumVM>或(List<GarhwalMusic.Model‌​s.AudioAlbumVM>)。您需要将List<GarhwalMusic.Model‌​s.AudioAlbumVM>传递给视图或更改视图以接受GarhwalMusic.Model‌​s.AudioAlbumVM类型的模型。

但是看看你的代码我假设你试图将AudioObjList的集合传递给你的View。因此,您的视图必须接受类型

的模型

GarhwalMusic.Model‌​s.AudioAlbumVM.AudioObjList,您只需要从控制器中传入viewModel.AudioObjList

编辑1 :在添加了更多视图详细信息之后,您在访问数据时的方式出错了。

您的Model.AudioObjList类型为IEnumerable<dynamic>,您如何才能在@Model.AudioObjList上打印一些内容?我指的是这段代码

<a class="art" href="single.html"> @Model.AudioObjList</a>

您需要将此动态类型强制转换为您在linq中创建的对象,然后提取其属性值。像

这样的东西
@((yourObject)Model.AudioObjList[0]).propertyName

(yourObject)Model.AudioObjList[0]类型会将您的dynamic数据投射到yourObject类型中。

您需要[0],因为AudioObjList的类型为IEnumerable<dynamic>。所以拿第一个数据。