2016-07-26 23 views
-1

Ich habe eine MVC-Ansicht, die ich aktualisieren muss. Der aktuelle Code sieht wie folgt aus:Wie wiederhole ich die Funktionalität zum Anzeigen von Links in MVC?

View -

@{ 
    ViewBag.Title = "TestView"; 

} 

<div class="row"> 
    <div class="col-lg-12"> 
     <h4>Current Report 1</h4> 
     @if (@ViewBag.DocID != null) 
     { 
      <p><a href="javascript:void(0);" onclick="DownloadFile('@ViewBag.DocID');" title="@ViewBag.DocName">@ViewBag.DocName</a> - <small>@ViewBag.UploadDateTime</small></p> 
     } 
     else 
     { 
      <p>There is not a current Report in the system at this time.</p> 
     } 


    </div> 
</div> 

-Controller -

public ActionResult TestView() 
    { 
     Report report = new Report(); 
     SearchCriteria sc = new SearchCriteria(); 

     sc.User = SessionData.User; 
     sc.DocType = 1; 
     report = DAL.GetReportWithTypeAndUser(sc); 

     if(report != null) 
     { 
      ViewBag.DocID = report.DocID; 
      ViewBag.DocName = report.DocName; 
      ViewBag.UploadDateTime = report.UploadDateTime; 
     } 

     return View(); 
    } 

Dieser Code funktioniert gut, wie es ist. Aber ich muss das für mehrere weitere Berichtstypen wiederholen. In meinem Controller sende ich momentan einen DocType = 1, aber ich müsste 2, 3, 4 usw. senden und verschiedene Typen zurückbekommen und sie auf die gleiche Weise auflisten, wie ich es momentan aus meiner Sicht mache.

Ich habe Schwierigkeiten, den besten Weg zu finden, dies zu tun. Jede Hilfe wäre willkommen!

Antwort

1

Verwenden Sie nicht die ViewBag. Verwenden Sie stattdessen ViewModels.

Ansichtsmodell:

public class ReportsViewModel 
{ 
    public ICollection<Report> Reports; 
} 

Entity:

public class Report 
{ 
    public int DocID { get; set; } 
    public string DocName { get; set; } 
    public DateTime UploadDateTime { get; set; } 
} 

Controller:

public ActionResult TestView() 
{ 
    // get your reports with different types 
    var reports = GetYourReports(); 

    var vm = new ReportsViewModel 
    { 
     Reports = reports 
    } 

    return View(vm); 
} 

Ausblick:

@model ReportsViewModel 

@{ 
    ViewBag.Title = "TestView"; 
} 

<div class="row"> 
    <div class="col-lg-12"> 
     @if (Model.Reports.Length > 0) 
     { 
      @foreach (var report in Models.Reports) 
      {      
       <p><a href="javascript:void(0); "onclick="DownloadFile('@report.DocID');" title="@report.DocName">@report.DocName</a> - <small>@report.UploadDateTime</small></p> 
      } 
     } 
     else 
     { 
      <p>There is not a current Report in the system at this time.</p> 
     } 
    </div> 
</div> 
+0

Dieses wa Genau das, was ich brauchte. Vielen Dank! – LDWisdom

0

Warum erstellen Sie kein Ansichtsmodell und binden Sie Ihre Ansicht daran?

public class Report 
{ 
    public int DocType {get; set;} 
    public int DocId {get; set;} 
    public string DocName {get; set;} 
    // Other properties 
} 

Dann können Sie die Ansicht auf dieses Modell binden, indem @model Report an der Spitze der Ansicht, das Hinzufügen, und Zugriff auf die Eigenschaften von @Model.DocType usw. in der Ansicht zu tun. Sie können sogar komplexere Logik in der Ansicht schreiben, die auf der Grundlage der DocType angepasst wird.

In der Steuerung können Sie eine Instanz der Report Klasse erstellen und den Eigenschaften entsprechende Werte zuweisen und dieses Objekt an die View übergeben, wenn Sie es instanziieren.