Retornando um editorTemplate como uma visualização parcial em um resultado de ação
-
24-09-2019 - |
Pergunta
Eu tenho um modelo semelhante a este:
public class myModel
{
public ClassA ObjectA {get; set;}
public ClassB ObjectB {get; set;}
}
Na minha visão principal, tenho tags semelhantes a esta:
<div id="section1">
<%=Html.EditorFor(m => m.ObjectA)%>
</div>
<div id="section2">
<%=Html.EditorFor(m => m.ObjectB)%>
</div>
Classa e Classb têm modelos de editor definidos.
Criei um JavaScript que faz uma chamada de Ajax para recarregar a seção1 div. Quero que o método de ação retorne o editor do Objecta, Classa.ascx que está na pasta EditorTemplates.
Eu tenho o seguinte no meu método de ação:
public ActionResult GetData(int input)
{
// Process input here and create modelData
return PartialView("ClassA", modelData);
}
Isso dá um erro porque não consegue encontrar a visualização da Classa.
Minha solução foi criar uma visualização parcial na pasta Views chamada "getData" e meu retorno renderiza a visualização getData. A visualização getData tem apenas uma linha de código:
<%=Html.RenderForModel()%>
Isso funciona, mas eu queria saber se havia uma maneira de um método de ação retornar e modelo de editor?
Solução
return PartialView("~/EditorTemplates/ClassA.ascx", modelData);
Outras dicas
Pontos de bônus para embalagem de presentes:
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);
}
}
Tenha o controlador (chamado, digamos, MyController) herdado da CustomControllerBase e depois:
public ActionResult MyAction(int id)
{
return EditorFor(new MyViewModel(id));
}
O código estará procurando "~/views/mycontroller/editorTemplates/myViewModel.ascx".
Isso funcionou para mim (MVC 4)
public ActionResult GetData(int input)
{
// Process input here and create modelData
return PartialView("EditorTemplates/ClassA", modelData);
}