簡體   English   中英

MVC多對多視圖

[英]MVC Many to Many View

我的項目再次出現問題。 我有兩個使用EF 5 DBContext Generator創建的模型:

第一:

    public int ID_AN { get; set; }
    public string TITLE_OR { get; set; }
    public string TITLE_EN { get; set; }

    public virtual ICollection<GENRES> GENRES { get; set; }

第二:

    public int ID_GE { get; set; }
    public string GENRE { get; set; }

    public virtual ICollection<ANIME> ANIME { get; set; }

之后我創建了控制器:

    public ActionResult Details(int id)
    {
        using (var db = new MainDatabaseEntities())
        {
            return View(db.ANIME.Find(id););             
        }
    }

並查看:

@model AnimeWeb.Models.ANIME

@{
ViewBag.Title = "Details";
}

<h2>Details</h2>

<fieldset>
<legend>ANIME</legend>

<div class="display-label">
     @Html.DisplayNameFor(model => model.TITLE_OR)
</div>
<div class="display-field">
    @Html.DisplayFor(model => model.TITLE_OR)
</div>

<div class="display-label">
     @Html.DisplayNameFor(model => model.TITLE_EN)
</div>
<div class="display-field">
    @Html.DisplayFor(model => model.TITLE_EN)
</div>

</fieldset>

到目前為止一切正常,但我想顯示所選動漫的所有類型。 當我嘗試添加

<div>
    @Html.DisplayFor(model => model.GENRES)
</div>

我收到一個錯誤:“ObjectContext實例已被釋放,不能再用於需要連接的操作。”

我是MVC的新手,所以如果有人能向我解釋如何讓它成功,我將非常感激。

實際上這是一個實體框架問題。 離開Controller后,你來不及要查詢數據庫。 實體框架是延遲加載(也就是按需)的類型。 要解決此問題,您應該更改查詢以在檢索Anime對象時顯式加載類型。

更新:從未告訴你如何做到這一點。 有許多方法可以明確地或急切地加載你的類型。 最好的資源是閱讀加載相關實體MSDN頁面 一種方法是在控制器中添加與以下類似的代碼(我認為這與你如何設置它有關)。

public ActionResult Details(int id)
{
    using (var db = new MainDatabaseEntities())
    {
        var anime = db.ANIME.Find(id);
        db.Entry(anime).Collection(a => a.GENRES).Load();
        return View(anime);             
    }
}

您可以使用“include”擴展方法來加載GENRES,如下所示:

db.ANIME.Include("GENRES").Find(id)

如果你想使用@Html.DisplayFor(model => model.GENRES)顯示所有的類型,你可以使用DisplayTemplates,檢查這個ASP.NET MVC顯示和編輯器模板

考慮在初始化控制器時初始化上下文,並將其置於控制器的dispose方法中。

這是Visual Studio中模板使用的模式(順便提一下)。

public class DemoController : Controller
{
    private MainDatabaseEntities db = new MainDatabaseEntities();

    public ActionResult Details(int id)
    {
        return View(db.ANIME.Find(id));
    }

    protected override void Dispose(bool disposing)
    {
        this.db.Dispose();
        base.Dispose(disposing);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM