Возврат 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);
}
Другие вопросы по тегам