2016-10-05 1 views
-1

Ich erstelle eine Website mit ASP.NET MVC und ich möchte eine Liste der Objekte anzeigen, die ich aus der Datenbank abrufen und eine andere Liste für jedes Objekt wurde abgerufen.ASP.NET MVC - Kann keine foreach Schleifen verschachteln, um Listen anzuzeigen

Hier ist mein Modell:

public class JournalViewModel 
{ 
    public JournalViewModel() 
    { 
     Issues = new List<Issue>(); 
    } 

    public int Id { get; set; } 

    [Required] 
    public string Title { get; set; } 

    [Required, DataType(DataType.MultilineText)] 
    public string Description { get; set; } 

    public string FileName { get; set; } 

    public string ContentType { get; set; } 

    public byte[] Content { get; set; } 

    [Required, ValidateFile] 
    public HttpPostedFileBase File { get; set; } 

    public int UserId { get; set; } 

    [Required, DataType(DataType.MultilineText)] 
    public string IssueDescription { get; set; } 

    [Required] 
    public string IssueTitle { get; set; } 

    [Required] 
    public int IssueNumber { get; set; } 

    public int IssueId { get; set; } 

    public ICollection<Issue> Issues { get; set; } 
} 

Mein Controller:

public ActionResult Index() 
{ 
    var userId = (int)_membershipService.GetUser().ProviderUserKey; 

    List<Journal> allJournals = _journalRepository.GetAllJournals(userId); 
    var journals = Mapper.Map<List<Journal>, List<JournalViewModel>>(allJournals); 
    return View(journals); 
} 

Und meine Ansicht:

@model List<Journals.Model.JournalViewModel> 

@{ 
    ViewBag.Title = "Index"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

@section Style 
{ 
    <style type="text/css"> 
     .table { 
      table-layout: fixed; 
     } 

      .table td { 
       white-space: nowrap; 
       overflow: hidden; 
       text-overflow: ellipsis; 
      } 
    </style> 
} 

<h2>Publisher - List of Journals</h2> 

<p> 
    @Html.ActionLink("Create New", "Create") 
</p> 

@if (Model.Count == 0) 
{ 
    <div> Click @Html.ActionLink("here", "Create") to publish your first Journal.</div> 
} 
else 
{ 

    <table class="table table-condensed table-striped"> 
     <thead> 
      <tr> 
       <th>Title</th> 
       <th>Description</th> 
       <th>File</th> 
       <th>Action</th> 
      </tr> 
     </thead> 
     <tbody> 
      @foreach (var item in Model) 
      { 
       <tr> 
        <td> 
         @Html.DisplayFor(modelItem => item.Title) 
        </td> 
        <td> 
         @Html.DisplayFor(modelItem => item.Description) 
        </td> 
        <td> 
         @Html.ActionLink(item.FileName, "GetFile", new { Id = item.Id }, new { target = "_blank" }) 
        </td> 
        <td> 
         @Html.ActionLink("Edit", "Edit", new { id = item.Id }) | 
         @Html.ActionLink("Delete", "Delete", new { id = item.Id }) 
        </td> 
       </tr> 
       @foreach (var issue in item.Issues) 
       { 
        <tr> 
         <td> 
          @Html.DisplayFor(i => issue.IssueTitle) 
         </td> 
        </tr> 
       } 
      } 
     </tbody> 
    </table> 
} 

Diese Ansicht verwendet funktionieren, bis ich diesen Code hinzugefügt:

@foreach (var issue in item.Issues) 
{ 
    <tr> 
     <td> 
      @Html.DisplayFor(i => issue.IssueTitle) 
     </td> 
    </tr> 
} 

Und jetzt hat es aufgehört zu arbeiten. Was mache ich falsch?

Gibt es auch eine Möglichkeit, eine Fehlermeldung von dieser Ansicht abzurufen?

+2

Was bedeutet "aufgehört zu arbeiten"? Außerdem hat 'JournalViewModel' die Eigenschaften' IssueTitle, IssueNumber, IssueId', aber auch eine Liste von 'Issue'; Warum sind diese drei Eigenschaften dort, wenn sie aussehen, als sollten sie Eigenschaften von 'Issue' sein? –

+1

Wie sieht Ihre 'Issue'-Klasse aus? 'IssueTitle' sieht aus, als wäre es eine Eigenschaft von' JournalViewModel', nicht 'Issue' –

+0

Hi, ja @PaulAbbott diese Eigenschaften sollten ein Teil der Issue-Klasse sein, allerdings habe ich sie dort temporär hinzugefügt, damit ich einige Tests machen konnte. Sie werden entfernt. – Felipe

Antwort

1

Entfernen Sie @ vor dem verschachtelten foreach Zyklus. Sie müssen auch Ihren Code überprüfen und herausfinden, wo die Standardausnahme unterdrückt wurde. Es kann entweder customErrors Abschnitt Konfiguration in web.config oder Application_Error Methode in der Datei Global.asax.cs sein. Wenn Standardausnahmen nicht unterdrückt werden, können Sie die Fehlerseite sehen, auf der Sie das Problem erkennen können.

+0

Die Ausnahmen wurden in Global.asax.cs unterdrückt. Darin war ein 'Server.ClearError()' Befehl enthalten. – Felipe

-1

Ich habe die @ vor der verschachtelten foreach als @Alexey Andrushkevich vorgeschlagen und meine Seite arbeitet jetzt.

Hinweis: Ich war in der Lage, keine Fehler zu bekommen, weil jemand anderes dieses „großen“ Fehlerbehandlungscode in Global.asax.cs hinzugefügt hatte:

protected void Application_Error(object sender, EventArgs e) 
{ 
    // Get the exception object. 
    Exception exc = Server.GetLastError(); 

    if (exc.GetType() == typeof(HttpException)) 
    { 
     if (exc.Message.Contains("Maximum request length exceeded.")) 
      Response.Redirect(String.Format("~/Error/RequestLengthExceeded")); 
    } 

    Server.ClearError(); 
} 

Dank diesen, keine Fehlermeldungen aus Die Webseiten tauchten auf.

Verwandte Themen