【问题标题】:How to return view with Outer Joins from two tables in MVC Razor如何从 MVC Razor 中的两个表返回带有外部联接的视图
【发布时间】:2017-04-30 02:38:32
【问题描述】:

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

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) 然后在控制器中然后在 cshtml 中创建 AudioAlbumVM 的帮助和说明。非常感谢任何帮助!

【问题讨论】:

  • 创建一个具有您需要在视图中使用的属性的视图模型,然后根据 GetAudio 方法的结果填充该视图模型
  • 显示AudioAlbumVMclass的定义
  • 在 linq 中,您需要将所需数据选择到 AudioAlbumVM 视图模型中。因此,如果您可以提供有关该类的详细信息,我们可以进一步提供帮助
  • 感谢您的 cmets 。很抱歉,我之前无法正确格式化我的问题。我已经更新了这个问题。有我的视图模型 AudioAlbumVM。希望这次我能说清楚。
  • @Deepak IEnumerable&lt;dynamic&gt; AudioObjList 这里你想用什么来代替dynamic ??

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


【解决方案1】:

从您的 cmets 中获取此信息

现在我收到此错误:- 传入字典的模型项的类型为“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&lt;GarhwalMusic.Model‌​s.AudioAlbumVM&gt; 或 (List&lt;GarhwalMusic.Model‌​s.AudioAlbumVM&gt;)。您需要将List&lt;GarhwalMusic.Model‌​s.AudioAlbumVM&gt; 传递给您的视图或更改您的视图以接受GarhwalMusic.Model‌​s.AudioAlbumVM 类型的模型。

但是查看您的代码,我假设您正在尝试将AudioObjList 的集合传递到您的视图中。所以你的视图必须接受一个类型的模型

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

编辑 1:在您添加更多视图细节后,您在访问数据的方式上犯了一个错误。

你的Model.AudioObjListIEnumerable&lt;dynamic&gt; 类型,你怎么能像@Model.AudioObjList 这样在Vie 上打印一些东西?我指的是这段代码

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

您需要将此动态类型类型转换为您在 linq 中创建的任何对象,然后提取其属性值。类似的东西

@((yourObject)Model.AudioObjList[0]).propertyName

(yourObject)Model.AudioObjList[0] 类型将您的dynamic 数据转换为yourObject 类型。

您需要[0],因为您的AudioObjListIEnumerable&lt;dynamic&gt; 类型。所以取第一个数据。

【讨论】:

  • 感谢您的回复。在我的控制器中,我更改了 return View(viewModel);返回视图(viewModel.AudioObjList);我的观点现在接受@model GarhwalMusic.Model‌​s.AudioAlbumVM.AudioObjList。但我现在收到此错误:- 无法将类型 'f__AnonymousType2' 隐式转换为 'System.Collections.Generic.IEnumerable'
  • @Deepak 查看您可能必须发布视图代码的原因以及出现此错误的部分..
  • 对不起,我现在喜欢学习 MVC,所以有些概念对我来说是新的。在这里我不知道如何在@((yourObject)Model.AudioObjList[0]).propertyName 中填写“yourObject”。我怎样才能访问它? PS:看来我永远不会解决这个问题。 :(
  • 我也尝试创建一个列表对象:- @{ List AAVM= ((au)Model.AudioObjList[0]).Album as List; } @foreach(var item in AAVM) { @item.AudioObjList } 这里在模型 GetDetailsVM 的 linq 中选择了 'au'。
  • 我在上面的问题中也强调了它。 var AudioList = from au in db.TblAudios join al in db.TblAlbums on au.ID 等于 al.AudioID into ar from al in ar.DefaultIfEmpty() select new { au,al };
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-25
  • 1970-01-01
相关资源
最近更新 更多