Возврат EditorTemplate в качестве PartialView в результате действия
У меня есть модель, похожая на эту:
public class myModel
{
public ClassA ObjectA {get; set;}
public ClassB ObjectB {get; set;}
}
В моем основном виде у меня есть теги, похожие на это:
<div id="section1">
<%=Html.EditorFor(m => m.ObjectA)%>
</div>
<div id="section2">
<%=Html.EditorFor(m => m.ObjectB)%>
</div>
Для ClassA и ClassB определены шаблоны Editor.
Я создал JavaScript, который делает Ajax-вызов для перезагрузки раздела section1. Я хочу, чтобы метод действия возвращал редактор для ObjectA, ClassA.ascx, который находится в папке EditorTemplates.
У меня есть следующее в моем методе действия:
public ActionResult GetData(int input)
{
// Process input here and create modelData
return PartialView("ClassA", modelData);
}
Это дает ошибку, потому что не может найти представление ClassA.
Мое решение состояло в том, чтобы создать PartialView в папке Views с именем "GetData", а мой возврат отображает представление GetData. Представление GetData имеет только одну строку кода:
<%=Html.RenderForModel()%>
Это работает, но мне было интересно, есть ли способ вернуть метод действия и редактировать шаблон?
3 ответа
return PartialView("~/EditorTemplates/ClassA.ascx", modelData);
Бонусные баллы за упаковку подарков:
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);
}
}
Пусть контроллер (называемый, скажем, MyController) наследуется от CustomControllerBase, а затем:
public ActionResult MyAction(int id)
{
return EditorFor(new MyViewModel(id));
}
Код будет искать "~/Views/MyController/EditorTemplates/MyViewModel.ascx".
Это сработало для меня (MVC 4)
public ActionResult GetData(int input)
{
// Process input here and create modelData
return PartialView("EditorTemplates/ClassA", modelData);
}