Подтвердить что ты не робот

Эквивалент Html.RenderAction в ядре ASP.NET

Я пытаюсь переключиться на ASP.NET Core из моего небольшого приложения ASP.NET MVC 4.

В моем приложении MVC 4 у меня есть файл макета, который использует RenderSection как:

@RenderSection("xyz", required: false)

Затем в моем файле индекса я:

@section xyz{
        @{Html.RenderAction("abc");}
    }

Итак, я вызываю метод действия abc() контроллера из индекса. Метод abc() передает объект модели и возвращает частичное представление с этой моделью. Я не могу использовать RenderPartial, так как ему нужна модель для передачи.

Теперь в ядре ASP.NET у меня нет метода RenderAction().

Мой вопрос: как я могу вызвать метод действия контроллера из моего файла индекса? Есть ли какой-нибудь другой помощник HTML для этого (хотя я его не вижу)?

.

4b9b3361

Ответ 1

Я наконец смог сделать это с ViewComponent. Поэтому вместо RenderAction() я сделал:

@section xyz{
        @await Component.InvokeAsync("abc")
    }

Где abc - это класс abcViewComponent. ViewComponent выглядит следующим образом:

public class abcViewComponent : ViewComponent
    {
        private DbContextOptions<MyContext> db = new DbContextOptions<MyContext>();
        public async Task<IViewComponentResult> InvokeAsync()
        {
            MyContext context = new MyContext(db);
            IEnumerable<tableRowClass> mc = await context.tableRows.ToListAsync();
            return View(mc);
        }
    }

Затем я создал представление в новой папке 'abc' в виде Views/Home/Components/abc/Default.cshtml

Следует отметить, что имя представления - Default.cshtml и именно так оно и работает. Если у кого-нибудь есть лучшее решение, пожалуйста, дайте мне знать.

Спасибо за указание мне в направлении ViewComponent.

Ответ 2

Просто для завершения вышеуказанного вопроса, вероятно, безопаснее передать имя класса ViewComponent, как показано ниже:

@section xyz{
    @await Component.InvokeAsync(nameof(yournamespace.abc))
}

и хотя в качестве результирующего представления обычно используется "По умолчанию", вы также можете вернуть имя вида, если оно отличается от значения по умолчанию:

public class abcViewComponent : ViewComponent
{
    private DbContextOptions<MyContext> db = new DbContextOptions<MyContext>();
    public async Task<IViewComponentResult> InvokeAsync()
    {
        MyContext context = new MyContext(db);
        IEnumerable<tableRowClass> mc = await context.tableRows.ToListAsync();
        return View("YourViewName", mc);
    }
}

Ответ 3

Существует обходной путь, вы можете использовать Url.Action + JQuery для рендеринга содержимого.

Вид, в котором вы хотите отобразить действие, будет выглядеть так:

<div id="dynamicContentContainer"></div>
<script>   
    $.get('@Url.Action("GetData", "Home")', {id : 1}, function(content){
            $("#dynamicContentContainer").html(content);
        });
</script>

Домашний контроллер:

[HttpGet]
public IActionResult GetData(int id)
{
   return PartialView(id);
}

Вид

@model int 
<span>Values from controler :</span> @Model