2010-03-03 8 views
22

tengo un modelo similar a esto:Devolución de un EditorTemplate como PartialView en una Acción Resultado - ASP.Net MVC 2

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

En mi vista principal, tengo etiquetas similares a esta:

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

ClassA y ClassB tienen plantillas de Editor definidas.

Creé algunos JavaScript que hacen una llamada AJAX para volver a cargar la sección1 div. Quiero que el método de acción devuelva el editor para ObjectA, ClassA.ascx que está en la carpeta EditorTemplates.

Tengo el siguiente en mi método de acción:

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

    return PartialView("ClassA", modelData); 
} 

Esto da un error porque no puede encontrar el punto de vista claseA.

Mi solución ha sido crear un PartialView en la carpeta Views llamado "GetData" y mi retorno representa la vista GetData. La vista GetData tiene una sola línea de código:

<%=Html.RenderForModel()%> 

Este trabajo hace, pero me preguntaba si había una manera para que un método de acción para volver y editor de plantillas?

Gracias a cualquier sugerencia que pueda proporcionar.

Respuesta

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

que no funciona. Todavía no puede encontrar la plantilla. Sin embargo, parece que solo buscó en la ubicación "~/EditorTemplates/ClassA.ascx", que no estaba esperando. –

+4

Sin embargo, dar la ruta completa desde la raíz de la aplicación funciona. Por ejemplo, "~/Views/MyView/EditorTemplates/ClassA.ascx". No sabía que podrías hacer esto. –

+0

¿Hay alguna manera de hacer que la vista represente la plantilla? Di si 'modelData' es del tipo' ClassA'? – Shimmy

27

puntos de bonificación para envolver regalos:

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); 
    } 
} 

Hacer que el controlador (denominado, por ejemplo, myController) heredar de CustomControllerBase, y luego:

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

El código se busca "~/Views/MyController/EditorTemplates/MyViewModel.ascx".

+1

¿Hay alguna manera de adjuntar el objeto recién creado a la propiedad de colección del modelo principal? – Shimmy

1

Esto funcionó para mí (MVC 4)

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

    return PartialView("EditorTemplates/ClassA", modelData); 
} 
Cuestiones relacionadas