2016-09-14 11 views
0

セットアップはthis postと似ていますが、ラムダに基づいて別のモデルの項目リストから特定の項目を表示するためにhtmlヘルパーを使用しようとしています表現。異なるモデルを使用するビューからモデルリスト項目変数を表示

私の例では、アルバムとジャンルを使用します。

namespace MvcMusicStore.Models 
{ 
    public class Album 
    { 
     public int  AlbumId  { get; set; } 
     public int  GenreId  { get; set; } 
     public int  ArtistId { get; set; } 
     public string Title  { get; set; } 
     public decimal Price  { get; set; } 
     public string AlbumArtUrl { get; set; } 
     public Genre Genre  { get; set; } 
    } 
} 
namespace MvcMusicStore.Models 
{ 
    public partial class Genre 
    { 
     public int  GenreId  { get; set; } 
     public string Name  { get; set; } 
     public string Description { get; set; } 
     public string ThisAlbumId  { get; set; } 
     public List<Album> Albums { get; set; } 
    } 
} 

ジャンルのモデルを使用し、私はそれは一つだけALBUMIDを返す必要がありAlbum.AlbumId == Genre.AlbumId

@foreach (var item in Model.Albums.Where(x=>x.AlbumId == Model.ThisAlbumId)) 
{ 
    <td>@Html.DisplayFor(modelItem => item.Title)</td> 
} 

Album.Titleを表示しようとしてるのビューがあります。現時点では、「値はnullにはなりません」というエラーが発生しています。私はまた、

<td>@Html.DisplayFor(model => model.Album.Where(x => x.Id == model.ThisAlbumId).FirstOrDefault())</td> 

を試みたが、私はエラーを取得:

Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions

すべてのヘルプや案内が大幅に高く評価されます。

+0

あなたのラムダ式私はデバッグのさらに下に得ることができますmodelItem =>項目は意味をなさない、使用品=>アイテムの代わりに – Noppey

答えて

1

最初にがうまく見えます。エラーのスタックトレースを見るのは良いことでした。しかし、の値をnullにすることはできません。の場合は、おそらくModelがnullであるためです。ビューのモデルがインスタンス化されておらず、継承されていないあなたのコードから、私はビューのモデルがGenreクラスであると推測することができます、あなたはビューにモデルを渡しているかどうかアクションメソッドをチェックインする必要があります。あなたが正しくそれをしなかった場合は、アクションメソッド内の関連する部分は次のように多少なります。コードの

Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions

この作品:エラーに関する

var model = new Genre 
    { 
     //set relevant properties 
    }; 
    //set other relevant 'model' properties, if any 
    return View("YourViewName", model); 

<td>@Html.DisplayFor(model => model.Album.Where(x => x.Id == model.ThisAlbumId).FirstOrDefault())</td> 

<td>@Model.Album.Where(x => x.Id == Model.ThisAlbumId).FirstOrDefault()</td> 
に変更する必要があります。

私がやったことは、.DisplayForを取り除くことです。エラーが示すように、.DisPlayForのようなテンプレートメソッドは、メソッドや他のラムダ型式では使用できません。

Albumインスタンスまたはnullを返す.FirstOrDefaultを呼び出しているため、別の問題があります。

<td> 
@{ 
    var oneItem = Model.FirstOrDefault(x => x.Id == Model.ThisAlbumId); 
    //Notice that I used "Model" and not "model". The difference is huge! 
    if (oneItem != null) 
    { 
     Html.Raw(oneItem.AlbumId); 
    } 
    } 
</td> 
+0

:何がしたいことは.AlbumIdプロパティですので、私は、次の編集を提案します鎖。 Model.Albumsがnullを返すように見えます。私はModel.ThisAlbumIdを、私が知っていた何かと置き換えたのは確かにデータベースに入っています。私の実際のプロジェクトは異なります。 New_Monitoring_DataはGenreを参照し、New_ContactはAlbumを参照します。 スティックトレース:http://pastebin.com/8nL0apzW – mkmitchell

+0

が見えます。 'parameter name:source'は列挙型、つまりリストを参照します。しかし、私の答えはそれが事実ではないと仮定しているので、あなたがヌルでないことを確かめた後でさえあなたがまだ問題を抱えていることを期待します。おそらく、あなたが質問で話した2番目のエラーメッセージが表示されるはずですので、私が提案した修正を加えるべきです。 –

+0

あなたのコメントが最も役立ちました。私はこのルートの代わりにタプルを使用して終了しましたが、まだ新しいアプローチであなたのアドバイスを使用しました。ありがとうございました – mkmitchell

関連する問題