2013-01-04 5 views
19

Ich muss einige untergeordnete Objekte (Items) einer Entität Request anzeigen. Anstelle von Request fand ich es besser, eine View zu übergeben, die mehr Informationen enthält als die ursprüngliche Request Entity. Diese Ansicht nannte ich RequestInfo, sie enthält auch die ursprünglichen Anfragen Id.Verwenden von RenderAction (Aktionsname, Werte) in MVC4 Problem

Dann in der MVC-Ansicht Ich habe:

@model CAPS.RequestInfo 
...  
@Html.RenderAction("Items", new { requestId = Model.Id }) 

Um Render:

public PartialViewResult Items(int requestId) 
{ 
    using (var db = new DbContext()) 
    { 
     var items = db.Items.Where(x => x.Request.Id == requestId); 
     return PartialView("_Items", items); 
    } 
} 

, die eine generische Liste angezeigt werden würde:

@model IEnumerable<CAPS.Item> 

<p> 
    @Html.ActionLink("Create New", "Create") 
</p> 
<table> 
    <tr> 
     <th> 
      @Html.DisplayNameFor(model => model.Code) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Description) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Qty) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Value) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Type) 
     </th> 
     <th></th> 
    </tr> 

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.Code) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Description) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Qty) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Value) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Type) 
     </td> 
     <td> 
      @Html.ActionLink("Edit", "Edit", new { id=item.Id }) | 
      @Html.ActionLink("Details", "Details", new { id=item.Id }) | 
      @Html.ActionLink("Delete", "Delete", new { id=item.Id }) 
     </td> 
    </tr> 
} 

</table> 

Aber ich bin immer einen Compiler-Fehler auf der RenderAction Linie "Kann nicht konvertieren Typ 'void' in 'o bject '" Irgendwelche Ideen?

Antwort

43

Sie benötigen diese Syntax zu verwenden, wenn die Methoden Render Aufruf:

@{ Html.RenderAction("Items", new { requestId = Model.Id }); } 

Die @syntax, ohne die geschweiften Klammern, erwartet einen Rückgabetyp, der auf die Seite gerendert wird. Um eine Methode aufzurufen, die void von der Seite zurückgibt, müssen Sie den Aufruf in geschweifte Klammern umbrechen.

Weitere Informationen finden Sie im folgenden Link.

http://haacked.com/archive/2009/11/18/aspnetmvc2-render-action.aspx

14

Zweckmässig Alternative:

@model CAPS.RequestInfo 
...  
@Html.Action("Items", new { requestId = Model.Id }) 

Dieser Code gibt MvcHtmlString. Funktioniert mit Teilansicht und Ergebnis anzeigen. Benötigt keine {} Zeichen.

+1

+1: Gleichwertige Antwort und bessere Anzüge Razor Syntax. Das braucht mehr Stimmen :) –