2017-02-01 6 views
2

Dies ist das erste Mal, dass ich sowohl eine MVC 5-Anwendung schreibe als auch C# verwende. Ich bin ziemlich weit gekommen und konnte einige Fehler, die mir begegnet sind, in Schwierigkeiten bringen.MVC 5 Detailansicht zeigt keine Daten für Felder mit Fremdschlüsseln

Ich habe ein paar Modelle und Tabellen eingerichtet, einschließlich Fremdschlüssel Referenzen. Auf meiner Indexseite, zeigt jeder Datensatz die Fremdschlüsselwerte mit dem folgenden Controller-Code:

Index Controller

public ActionResult Index(int? filterDwg) 
{ 
    var checkOut = db.CheckOut.Include(c => c.CheckOutStatus).Include(c => c.DwgList); 
    var checkedOut = checkOut.Where(s => s.CheckStatus == (1)); 

    //Filtering by Drawing 
    if (filterDwg != null) 
    { 
     checkedOut = checkedOut.Where(d => d.DrawingId == (filterDwg)); 
    } 

    return View(checkedOut.ToList()); 
} 

Nun, meine Details Seite, mein Controller ist wie folgt:

Details Steuerung

public ActionResult Details(int? id) 
{ 
    if (id == null) 
    { 
     return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
    } 
    CheckOut checkOut = db.CheckOut.Find(id); 

    if (checkOut == null) 
    { 
     return HttpNotFound(); 
    } 


    return View(checkOut); 
} 

Wenn ich die fol Muhen Ansicht:

Details anzeigen

@model NoDwgASP.Models.CheckOut 


@{ 
    ViewBag.Title = "Details"; 
} 

<h2>Details</h2> 

<div> 
    <h4>CheckOut</h4> 
    <hr /> 
    <dl class="dl-horizontal"> 
     <dt> 
      @Html.DisplayNameFor(model => model.CheckOutStatus.CheckStatusName) 
     </dt> 

     <dd> 
      @Html.DisplayFor(model => model.CheckOutStatus.CheckStatusName) 
     </dd> 

     <dt> 
      @Html.DisplayNameFor(model => model.DwgList.DwgNum) 
     </dt> 

     <dd> 

      @Html.DisplayFor(model => model.DwgList.DwgNum) 
     </dd> 

     <dt> 
      @Html.DisplayNameFor(model => model.UserInitials) 
     </dt> 

     <dd> 
      @Html.DisplayFor(model => model.UserInitials) 
     </dd> 

     <dt> 
      @Html.DisplayNameFor(model => model.Project) 
     </dt> 

     <dd> 
      @Html.DisplayFor(model => model.Project) 
     </dd> 

     <dt> 
      @Html.DisplayNameFor(model => model.CheckOutDate) 
     </dt> 

     <dd> 
      @Html.DisplayFor(model => model.CheckOutDate) 
     </dd> 

     <dt> 
      @Html.DisplayNameFor(model => model.ReturnDate) 
     </dt> 

     <dd> 
      @Html.DisplayFor(model => model.ReturnDate) 
     </dd> 

    </dl> 
</div> 
<p> 
    @Html.ActionLink("Edit", "Edit", new { id = Model.CheckId }) | 
    @Html.ActionLink("Back to List", "Index") 
</p> 

Die Felder für DwgNum und CheckStatusName sind leer. Diese Felder sind Ganzzahlen und Fremdschlüssel, die an eine andere Datenbank gebunden sind, die über Zeichenfolgenwerte für diese Eigenschaften verfügt.

Ich weiß, ich brauche, um so etwas wie

var checkOut = db.CheckOut.Include(c => c.CheckOutStatus).Include(c => c.DwgList) 

wie ich in meinem Index Controller tat aber ich kann nicht einfach eine .INCLUDE anhängen auf

CheckOut checkOut = db.CheckOut.Find(id); 

Hat Anregungen jemand? Ich bin ratlos, und ich konnte keine verwandten Probleme finden.

+1

Sie können 'db.CheckOut.Include (....) Wo (x => x.ID == id) .FirstOrDefault();.' (vorausgesetzt, 'ID' ist Ihr PK-Feld) –

+0

Vielen Dank! Das hat funktioniert ... Ich war auf dem Weg zurück, um mein eigenes zu beantworten, denn ich hatte die Idee nach "combinate include und finde MVC 5" zu suchen, nachdem ich gepostet habe .... http://stackoverflow.com/questions/7348663/ c-sharp-entity-framework-how-can-i-combine-a-find-and-include-on-a-model-obje – mecasull

+0

Die Find-Methode unterstützt nicht Include. Das liegt möglicherweise daran, dass Find zuerst versucht, nach im Speicher geladenen Entitäten zu suchen, und dann versucht, zur Datenbank zurückzukehren, sodass Sie Where wie von Stephen vorgeschlagen verwenden müssen. – Vinod

Antwort

0

wie oben erwähnt ..

public ActionResult Details(int? id) 
{ 
    if (id == null) 
    { 
     return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
    } 
    CheckOut checkOut = db.CheckOut 
     .Include(c => c.CheckOutStatus) 
     .Include(c => c.DwgList) 
     .SingleOrDefault(x => x.CheckId == id); 

    if (checkOut == null) 
    { 
     return HttpNotFound(); 
    } 

    return View(checkOut); 
}