Возврат EditorTemplate в качестве PartialView в результате действия - PullRequest
24 голосов
/ 03 марта 2010

У меня есть модель, подобная этой:

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 определены шаблоны редактора.

Я создал некоторый JavaScript, который делает Ajax-вызов для перезагрузки раздела section1. Я хочу, чтобы метод действия возвращал редактор для ObjectA, ClassA.ascx, который находится в папке EditorTemplates.

У меня в методе Action есть следующее:

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

    return PartialView("ClassA", modelData);
}

Это дает ошибку, потому что не может найти представление ClassA.

Мое решение состояло в том, чтобы создать PartialView в папке Views с именем «GetData», а мой возврат отображает представление GetData. Представление GetData имеет только одну строку кода:

<%=Html.RenderForModel()%>

Это работает, но мне было интересно, есть ли способ для метода действия для возврата и редактирования шаблона?

Ответы [ 3 ]

27 голосов
/ 07 января 2011

Бонусных баллов за упаковку подарка:

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".

24 голосов
/ 03 марта 2010
return PartialView("~/EditorTemplates/ClassA.ascx", modelData);
2 голосов
/ 28 мая 2015

у меня это сработало ( mvc 4 )

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

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