2

Я пытаюсь использовать функцию ViewComponents.InvokeAsync(), но почему-то это не асинхронный. Он ждет рендеринга кода компонента. http://docs.asp.net/en/latest/mvc/views/view-components.htmlViewComponents не async

Мой код очень похож на тот, который описан в приведенном выше примере. Я использую страницу макета, которая появляется при создании нового приложения в MVC 6.

Я думал, что метод ViewComponent.InvokeAsync() будет асинхронно отображаться относительно главной страницы. Но это не так. Для этого нам необходимо использовать AJAX, как описано here.

+0

Когда вы говорите, "Он ждет," что вы имеете в виду? То есть, что означает «это»? –

+0

Страница отображается только при визуализации компонента. Я ожидаю, что страница закончит рендеринг, а затем компонент будет отображаться асинхронно. Кроме того, я хотел бы иметь spinner (gif), который находится на месте для компонента, пока он не будет отображаться. – Jash

ответ

7

Server Side Асинхронный не на стороне клиента Асинхронный

стороне сервера асинхронной не делает частичный рендеринг страницы в веб-браузере. Следующий код будет заблокирован до тех пор, пока не вернется GetItemsAsync.

public async Task<IViewComponentResult> InvokeAsync() 
{ 
    var items = await GetItemsAsync(); 
    return View(items); 
} 

И этот код будет заблокирован до завершения itemsTask.

public async Task<IViewComponentResult> InvokeAsync() 
{ 
    var itemsTask = GetItemsAsync(maxPriority, isDone); 

    // We can do some other work here, 
    // while the itemsTask is still running. 

    var items = await itemsTask; 
    return View(items); 
} 

сторона сервера асинхронные позволяет нам делать дополнительную работу на сервере пока мы ждем какой-либо другой стороны сервера задачи для завершения.

AJAX Просмотр компонентов

Для частичного отображения страницы в веб-браузере, необходимо использовать на стороне клиента AJAX. В следующем примере мы используем AJAX для вызова /Home/GetHelloWorld и визуализации в body.

~/HelloWorldViewComponent.cs

public class HelloWorldViewComponent : ViewComponent 
{ 
    public IViewComponentResult Invoke() 
    { 
     var model = new string[] 
     { 
      "Hello", "from", "the", "view", "component." 
     }; 

     return View("Default", model); 
    }  
} 

~/HomeController.cs

public class HomeController : Controller 
{ 
    public IActionResult GetHelloWorld() 
    { 
     return ViewComponent("HelloWorld"); 
    } 
} 

~/просмотров/Общие/Компоненты/HelloWorld/Default.cshtml

@model string[] 

<ul> 
    @foreach(var item in Model) 
    { 
     <li>@item</li> 
    } 
</ul> 

~/Wwwroot/index.html

<body> 
<script src="js/jquery.min.js"></script> 
<script> 
    $.get("home/GetHelloWorld", function(data) { 
     $("body").html(data); 
    }); 
</script> 
</body> 

локальный: 5000/index.html

A unordered list that shows the string array.

+0

Привет Shaun, я знаю, что async делает в C#. В приведенном выше коде отлично, что рендеринг компонента будет заблокирован. Но я ищу остальную часть страницы, чтобы получить рендеринг сначала, а затем компонент. Я думал, что смогу добиться этого с помощью компонента @await.InvokeAsync(). Пожалуйста, исправьте меня здесь – Jash

+1

Да. Вы не можете сделать это. '@ await' по-прежнему не является стороной на стороне сервера.Подумайте об этом, как 'await' в коде C#. Это просто означает, что мы можем делать другие вещи на сервере между запуском задачи и ожиданием ее завершения. Он вообще не разговаривает с клиентом. –

+0

Хорошо, неправильно понял ViewComponent.InvokeAsync. Итак, могу ли я назвать компоненты с помощью AJAX? любые образцы действительно помогли бы. Я пытаюсь достичь: у меня есть компонент вида, который я хочу использовать на моей странице XYZ, но я хочу, чтобы этот компонент представления отображался асинхронно. – Jash