2013-12-07 31 views
1

我正在處理ASP.NET MVC 4應用程序。我使用EF 5Code First。我有兩個實體1:N關係:如何在剃刀中的請求之間持久保存ICollection實體屬性

public class Menu 
{ 
    //some properties 
    public virtual ICollection<Document> Documents { get; set; } 
} 

和:

public class Document 
{ 
//some properties.. 
public int MenuID { get; set; } 
public virtual Menu Menu { get; set; } 
} 

我有Edit視圖與[HttpPost][HttpGet]方法。當我穿過GET動作這樣的模式:

   Menu model = unitOfWork.MenuRepository.GetById(Id); 
       if (model != null) 
       { 
        return View(model); 
       } 

一切是正確的,我可以看到,模型包含1 Documents但後來在我的Razor視圖,如果我只是嘗試:

@Html.HiddenFor(m => m.Documents) 

然後當我將表單提交到Post操作時,我可以看到Documents屬性爲空。

如何保持Documents持久?

回答

2

集合中的任何內容都不會按照您的預期呈現。你需要創建say,一個期望集合的displaytemplate,然後將這些文檔的屬性呈現在HiddenFor中,或者如果你不想顯示模板,那麼在相同的視圖上做同樣的事情。

例如,這是你需要做的:

@for(int counter = 0; counter < Model.Documents; counter++) 
{ 
    @Html.HiddenFor(m => Model.Documents[counter].Id) 
    @Html.HiddenFor(m => Model.Documents[counter].Title) 
    // and so on 
} 

所以現在當你回傳,它有它需要對發動機的所有屬性結合並把它傳遞給你的控制器的方法和服務它起來。

+0

嗯,我只是爲了它而試過。首先 - 它似乎不能對'ICollection'使用'[]'索引器,其次,即使我將實體中的類型更改爲其他類型,它仍然不是一個非常優雅的解決方案。 – Leron

+0

嗨@Leron--對不起,我在腦海裏想你不會使用ICollection,但我腦中的一部分卻在說「是的,他在標題中是這麼說的」。解決方案可能不夠高雅,但這是如何做到的。我和你在同一艘船上,而且這個工作。更好的方法是使用這些代碼,但在顯示或編輯器模板中,所以您只需引用它,然後讓模板完成這項工作。你可以使用ToList()來給你索引器能力 –

+0

只是添加,你確實需要索引器,否則MVC引擎將無法正確地綁定回來。事實上它不會這樣做。這就是引擎的工作原理。我以前嘗試過很多方法,而這是唯一的方法 - 我也讀過一篇博客文章(現在不記得哪一個),證實了同樣的事情。 –

相關問題