2011-03-18 5 views
0

J'ai un problème avec le renvoi d'une vue partielle d'un contrôleur avec un modèle différent de celui de ma vue principale. Par exemple:HTML.Partial - MVC 3 Razor

public ActionResult Index() 
    { 
     //myModel - get Some Types 
     return View(mymodel); 
    } 

    public PartialViewResult Categories() 
    { 
     //my another Model - get different Types 

     return PartialView(myanothermodel); 
    } 

Et puis Index Vue:

@Html.RenderPartial("Categories")

Je reçois une exception en disant qu'il est du mauvais type. Il attend le premier type (mymodel) au lieu du second type.

Est-il possible de renvoyer différents types pour la vue et sa vue partielle? Merci pour la réponse.

Répondre

5

Il semble que vous essayez de rendre l'action , pas l'affichage.

Appelez @Html.Action("Categories").

+0

Merci! Ça marche :) – jars

+0

@jars: De rien. Vous devriez accepter cette réponse en cliquant sur le chèque creux. – SLaks

+0

Pourquoi '@ Html.Action'?et 'PartialViewResult' doit-il changer en' ActionResult'. Il semble que la manière est comme ne pas utiliser la vue partielle. – CallMeLaNN

0

Je viens de comprendre un peu comment la vue partielle fonctionne. Dans votre cas et en fait, pas besoin de définir l'action Categories() si vous pensez que la logique pour obtenir myanothermodel peut être fait dans l'action Index().

J'ai mymodel.myanothermodel attribué à l'action Index() puis dans le fortement typé Index.cshtml je ceci: (supposons myanothermodel est Categories)

@{Html.RenderPartial("Categories", Model.Categories);} 

alternative:

@Html.Partial("Categories", Model.Categories) 

Notez que toujours utiliser .RenderPartial() plutôt que .Partial() pour de meilleures performances dans la vue .cshtml. J'ai utilisé Model.Categories au lieu de mymodel.Categories en raison de la forte typée Index.cshtml ont déjà @model mymodel au début du fichier.

Dans ma pratique, j'ai les modèles:

  • Model.Departments - IList<DepartmentModel>
  • Model.SelectedDepartment - DepartmentModel
  • Model.Employees - IList<EmployeeModel>

qui est utilisé dans:

@{Html.RenderPartial("DepartmentMenu", Model.Departments);} 

<div id="employeeViewContainner"> 
    @foreach (var emp in Model.Employees) 
    { 
     Html.RenderPartial("CardView" + Model.SelectedDepartments.Name, emp); 
    } 
</div> 

Cela rendra la liste des employés avec différentes habillages pour différents départements.

1

Lorsque vous utilisez Vue partielle utiliser uniquement

@Html.Partial("Categories", Model) 

ou un modèle spécifique dans vos propres données

@Html.Partial("Categories", Model.Category)