2016-09-14 70 views
0

我有一個類似於this post的設置,並試圖使用html助手在基於lambda的單獨模型中的項目列表中顯示特定項目表達。從使用不同模型的視圖中顯示模型列表項變量

我會在我的例子中使用專輯和流派。

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; } 
    } 
} 

有使用該類型模型的圖,我試圖顯示Album.Title其中Album.AlbumId == Genre.AlbumId

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

應該只返回一個ALBUMID。目前我收到「Value can not be 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

你的lambda表達式modelItem =>項是沒有意義的,使用項目=>項目,而不是 – Noppey

回答

1

第一個嘗試看起來不錯。很高興看到錯誤的堆棧跟蹤。但如果你得到的的值不能爲空,那麼這很可能是因爲Model爲空;即視圖的模型沒有被實例化並被傳遞。從你的代碼中,我可以推斷出該視圖的模型是Genre類,你應該檢查action方法是否將模型傳遞給視圖。如果你正確地做到了,在操作方法的相關部分應該看起來有點像這樣:

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

關於第二錯誤:

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

這段代碼:

<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這樣的模板方法不能與方法或其他lambda類型表達式一起使用。

但是,另一個問題是,因爲你打電話.FirstOrDefault這將返回一個Album實例或null。既然你想要什麼.AlbumId財產,那麼我建議以下編輯:

<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

,可以幫助我進一步下不來調試鏈。看起來Model.Albums返回null。我用一些我知道在數據庫中的東西替換Model.ThisAlbumId來確保。我的真實項目是不同的。 New_Monitoring_Data引用流派,New_Contact引用相冊。 Strack trace:http://pastebin.com/8nL0apzW – mkmitchell

+0

我可以看到。 '參數名稱:source'是指可枚舉的,即列表。不過,我的回答假設情況並非如此,所以即使在確認它不爲空之後,我仍然認爲你仍然有問題。您應該可能會收到您在問題中提到的第二條錯誤消息,因此您應該進行我提出的修改。 –

+0

您的意見是最有幫助的。我最終使用了一個Tuple而不是這條路線,但仍然使用了你的建議。謝謝 – mkmitchell

相關問題