1

Есть асинхронный метод

ReportController.cs

public async Task<ActionResult> GetRMschools()
        {
            Account account = new Account("chr_coko.pto@mail.ru", "***");
            var api = new MailRuCloud();
            api.Account = account;
            string schoolID = User.Identity.Name;
            var items = await api.GetItems($@"/Reports/{schoolID}");
        school school_current = schoolRepository.GetT(schoolID);
        List&lt;RMschool&gt; model = new List&lt;RMschool&gt;();            
        foreach (var file_name in items.Files) //e.g. file_name = &quot;0001_201636.zip&quot;
        {
            int report_code = Convert.ToInt32(file_name.Name.Substring(5, 6)); //e.g. report_code = 201636
            var ob = monit95Context.ReportMetas.Find(report_code);
            model.Add(new RMschool
            {
                code = ob.code,
                name = ob.name,
                ProjectName = ob.ProjectName,
                year = ob.year,
                WWWref = $@&quot;{school_current.ReportLink}/{file_name.Name}&quot;
            });
        }
        return PartialView(&quot;_GetRMschools&quot;, model);

который вызывает частичное представление

_GetRMschools.cshtml

@using Monit95App.Models
@model List<RMschool>
<body>
    <table class="table">
        <thead class="thead-inverse">
            <tr>
                <th>Проект</th>
                <th>Отчет</th>
                <th>Учебный год</th>
            </tr>
        </thead>
        @foreach (var reportMeta in Model.OrderByDescending(x => x.code))
        {
            <tr>
                <td>@reportMeta.ProjectName</td>
                <td><a href="@reportMeta.WWWref">@reportMeta.name</a></td>
                <td>@reportMeta.year</td>
            </tr>
        }
    </table>
</body>

Теперь я пытаюсь получить это частичное представление в другом View

Report.cshtml

<h2>Отчеты</h2>
@Html.Action("GetRMschools")

При запуске выводит:

Ошибка выполнения дочернего запроса для дескриптора 'System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper'

HttpServerUtility.Execute является заблокированным до окончания выполнения асинхронной операции.

  1. Почему так происходит?
  2. Как исправить?
  • сделайте Action который возвращает PartialView обычным (без async await) посмотрим что получится – Ruslan_K Oct 23 '16 at 15:37
  • @Ruslan_K к сожалению это не вариант - API MailCloud написан на асинхронных вызовах. Я изначально так сделать пытался. – Adam Shakhabov Oct 23 '16 at 15:41
  • для теста можно проверить так var items = api.GetItems($@"/Reports/{schoolID}").Result; – Ruslan_K Oct 23 '16 at 16:07
  • @Ruslan_K я сделал так: на этой строке у меня программа зависает - уходит как-бы в "спякчу". – Adam Shakhabov Oct 23 '16 at 17:29
  • понятно, ну подождем что скажут более опытные участники SO :) – Ruslan_K Oct 23 '16 at 17:31
  • Про зависание: http://ru.stackoverflow.com/questions/514529/%D0%97%D0%B0%D0%B2%D0%B8%D1%81%D0%B0%D0%B5%D1%82-%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80-await-%D0%B2-%D0%BE%D0%BA%D0%BE%D0%BD%D0%BD%D0%BE%D0%BC-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8-%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0-%D0%B2%D0%B8%D1%81%D0%B8%D1%82-%D0%BF%D1%80%D0%B8-%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%D0%B5-task – Pavel Mayorov Oct 24 '16 at 07:00
  • Пожалуйста, сведите ваш вопрос к [mcve]. Сейчас он слишком сложный для понимания кем-то кроме вас самого. – Pavel Mayorov Oct 24 '16 at 07:01

1 Answers1

0

Причина из-за которой все не работало: если action контроллера вызывается из View, то такой вызов считается дочерним. А в ASP.NET MVC 5 дочерние методы нельзя вызывать асинхронно. В ASP.NET Core вроде все как-то по другому, на сколько я правильно понял.

Сложность задачи для меня заключается в том что: мне необходимо вызывать частичное представление _RMschool.cshtml на разных страницах моего приложения, а оно у меня типизированное. И поэтому перед его вызовом (_RMschool.cshtml) необходимо еще получить модель для нее.

Решение. Нашел статью в Интернете и с ее помощью вышел из ситуации:

ReportController.cs

[HttpGet]
public async Task<ActionResult> Report()
{
    var model = await GetRMschoolList(User.Identity.Name);
    return PartialView("_RMschool", model);
}

public async Task<ActionResult> GetRMschoolPV(string _schoolID)            
{
    var model = await this.GetRMschoolList(_schoolID);
    return PartialView("_RMschool", model);
}

public async Task<List<RMschool>> GetRMschoolList(string _schoolID)  //GetViewModel       
{
    Account account = new Account("chr_coko.pto@mail.ru", "***");
    var api = new MailRuCloud();
    api.Account = account;            
    var items = await api.GetItems($@"/Reports/{_schoolID}");            

    school school_current = schoolRepository.GetT(_schoolID);
    List<RMschool> model = new List<RMschool>();            
    //du stuff
    return (model);
}  

Report.cshtml

@model IEnumerable<Monit95App.Models.RMschool>

@{ Html.RenderPartial("_RMschool", Model);}

_RMschool.cshtml

@model IEnumerable<Monit95App.Models.RMschool>

    <body>
        <table class="table">        
            <thead class="thead-inverse">
                <tr>
                    <th>Проект</th>
                    <th>Отчет</th>
                    <th>Учебный год</th>
                </tr>
            </thead>
            @foreach (var reportMeta in Model.OrderByDescending(x => x.code))
            {
                <tr>
                    <td>@reportMeta.ProjectName</td>
                    <td><a href="@reportMeta.WWWref">@reportMeta.name</a></td>
                    <td>@reportMeta.year</td>
                </tr>
            }
        </table>
    </body>
  • Слишком сложно получилось. Выглядит так, будто вам не требуется два разных View. – Pavel Mayorov Oct 24 '16 at 06:58
  • 1
    Кроме того, что и почему произошло - так и не объяснено. – Pavel Mayorov Oct 24 '16 at 06:59
  • @PavelMayorov спасибо за замечание по поводу не указания причины. Ответ отредактирован. – Adam Shakhabov Oct 24 '16 at 09:10
  • @PavelMayorov по поводу Выглядит так, будто вам не требуется два разных View. Не совсем понял замечание. Можете более развернуто сказать? – Adam Shakhabov Oct 24 '16 at 09:19
  • 1
    У вас Report.cshtml используется только для включения _RMschool.cshtml. Можно было отображать сразу второй файл. – Pavel Mayorov Oct 24 '16 at 09:35