2010-03-03 4 views
22

J'ai un modèle similaire à ceci:un retour EditorTemplate comme PartialView dans un Résultat d'action - ASP.Net MVC 2

public class myModel 
{ 
    public ClassA ObjectA {get; set;} 
    public ClassB ObjectB {get; set;} 
} 

À mon avis principale, je balises similaires à cela:

<div id="section1"> 
    <%=Html.EditorFor(m => m.ObjectA)%> 
</div> 
<div id="section2"> 
    <%=Html.EditorFor(m => m.ObjectB)%> 
</div> 

ClassA et ClassB les deux ont éditeur de modèles définis.

Je crée un peu de JavaScript qui fait un appel AJAX pour recharger la Section1 div. Je veux que la méthode d'action renvoie l'éditeur pour ObjectA, ClassA.ascx qui se trouve dans le dossier EditorTemplates.

Je donne les résultats suivants dans ma méthode d'action:

public ActionResult GetData(int input) 
{ 
    // Process input here and create modelData 

    return PartialView("ClassA", modelData); 
} 

Cela donne une erreur, car il ne peut pas trouver le point de vue ClassA.

Ma solution a été de créer un PartialView dans le dossier Vues appelé « GetData » et mon retour rend la vue GetData. La vue GetData n'a qu'une seule ligne de code:

<%=Html.RenderForModel()%> 

Cela fonctionne, mais je me demandais s'il y avait un moyen d'une méthode d'action pour revenir et le modèle de l'éditeur?

Merci à toute suggestion que vous pouvez fournir.

Répondre

23
return PartialView("~/EditorTemplates/ClassA.ascx", modelData); 
+0

qui ne fonctionne pas. Il ne peut toujours pas trouver le modèle. Cependant, il semble qu'il ne cherchait l'emplacement « ~/EditorTemplates/ClassA.ascx », que je ne m'y attendais pas. –

+4

Cependant, en donnant le chemin complet de la racine de l'application fonctionne. Par exemple, "~/Views/MyView/EditorTemplates/ClassA.ascx". Je ne savais pas que tu pouvais faire ça. –

+0

Existe-t-il un moyen de rendre le rendu du modèle lui-même? Dites si 'modelData' est de type' ClassA'? – Shimmy

27

points bonus pour emballage cadeau:

public class CustomControllerBase : Controller 
{ 
    public PartialViewResult EditorFor<TModel>(TModel model) 
    { 
     return PartialView("EditorTemplates/" + typeof(TModel).Name, model); 
    } 

    public PartialViewResult DisplayFor<TModel>(TModel model) 
    { 
     return PartialView("DisplayTemplates/" + typeof(TModel).Name, model); 
    } 
} 

Demandez le contrôleur (appelé, par exemple, MyController) hériter de CustomControllerBase, puis:

public ActionResult MyAction(int id) 
{ 
    return EditorFor(new MyViewModel(id)); 
} 

Le code sera à la recherche "~/Vues/MyController/EditorTemplates/MyViewModel.ascx".

+1

Un moyen de joindre l'objet nouvellement créé à la propriété de collection du modèle parent? – Shimmy

1

cela a fonctionné pour moi (mvc 4)

public ActionResult GetData(int input) 
{ 
    // Process input here and create modelData 

    return PartialView("EditorTemplates/ClassA", modelData); 
} 
Questions connexes