Ошибки и предупреждения при использовании блока @functions в Razor Pages - PullRequest
1 голос
/ 21 марта 2020

Поскольку директива @helper больше не поддерживается в ASP. NET Core Razor Pages, вместо этого я использовал директиву @functions.

@functions
{
    void RenderTask(Models.Task task)
    {
        <tr>
            <td class="@Model.CssClass">
                <p class="compact">
                    <span class="font-weight-bold">@task.Title</span>
                    @if (!string.IsNullOrWhiteSpace(task.Description))
                    {
                        <br />@task.Description
                    }
                </p>
            </td>
            <td class="@Model.CssClass">
                <img src="~/images/Edit.png" class="edit-area button-img" data-id="@task.Id" title="Edit" />
                <img src="~/images/Delete.png" class="delete-area button-img" data-id="@task.Id" title="Delete" />
            </td>
        </tr>
    }
}

Это похоже на работу но я получаю ошибку:

Ошибка MVC1006: метод содержит TagHelper и, следовательно, должен быть асин c и возвращать задачу. Например, использование ~ / обычно приводит к TagHelper и требует asyn c Task, возвращающего родительский метод.

Поэтому я изменил эту функцию на async, и я использовал await ключевое слово в любом месте, где оно называется.

@functions
{
    async System.Threading.Tasks.Task RenderTask(Models.Task task)
    {
        <tr>
            <td class="@Model.CssClass">
                <p class="compact">
                    <span class="font-weight-bold">@task.Title</span>
                    @if (!string.IsNullOrWhiteSpace(task.Description))
                    {
                        <br />@task.Description
                    }
                </p>
            </td>
            <td class="@Model.CssClass">
                <img src="~/images/Edit.png" class="edit-area button-img" data-id="@task.Id" title="Edit" />
                <img src="~/images/Delete.png" class="delete-area button-img" data-id="@task.Id" title="Delete" />
            </td>
        </tr>
    }
}

Это на самом деле работает, но я получаю предупреждения:

... \ Razor \ Pages \ Tasks \ Index.cs html .g.cs (286,200,286,202): предупреждение CS1998: в этом методе asyn c отсутствуют операторы 'await' и он будет работать синхронно. Попробуйте использовать оператор 'await' для ожидания неблокирующих вызовов API или 'await Task.Run (...)' для выполнения работы с процессором в фоновом потоке.
... \ Razor \ Pages \ Tasks \ Index.cs html .g.cs (312,200,312,202): предупреждение CS1998: в этом асинхронном c методе отсутствуют операторы «ожидания» и он будет работать синхронно. Подумайте об использовании оператора «await» для ожидания неблокирующих вызовов API или «await Task.Run (...)» для выполнения работы с привязкой к ЦП в фоновом потоке.

Index.cs html .g.cs является своего рода промежуточным файлом. Но я не знаю, какие цифры следуют за ним, и двойной щелчок по этим предупреждениям не выводит меня на оскорбительную строку.

На данный момент, я не уверен, в чем проблема. Я много гуглил, но не нашел хорошего примера того, что я должен делать. Любые предложения приветствуются.

Обновление:

Вот раздел Index.cs html .g.cs :

#nullable restore
#line 86 "D:\Users\Jonathan\source\repos\Bamtok\Bamtok\Pages\Tasks\Index.cshtml"
                                                                          Write(task.Id);

#line default
#line hidden
#nullable disable
        __tagHelperStringValueBuffer = EndWriteTagHelperAttribute();
        __tagHelperExecutionContext.AddHtmlAttribute("data-id", Html.Raw(__tagHelperStringValueBuffer), global::Microsoft.AspNetCore.Razor.TagHelpers.HtmlAttributeValueStyle.DoubleQuotes);
        __tagHelperExecutionContext.AddHtmlAttribute(__tagHelperAttribute_3);
        await __tagHelperRunner.RunAsync(__tagHelperExecutionContext); // *** ERROR HERE! ***
        if (!__tagHelperExecutionContext.Output.IsContentModified)
        {
            await __tagHelperExecutionContext.SetOutputContentAsync();
        }
        Write(__tagHelperExecutionContext.Output);
        __tagHelperExecutionContext = __tagHelperScopeManager.End();
        WriteLiteral("\r\n                ");
        __tagHelperExecutionContext = __tagHelperScopeManager.Begin("img", global::Microsoft.AspNetCore.Razor.TagHelpers.TagMode.SelfClosing, "5fc6845fce9caf31066e5edd3fc6a51f323364e715810", async() => {
        }
        );

Ответы [ 2 ]

2 голосов
/ 23 марта 2020

Microsoft только что подтвердил предупреждения являются ошибкой.

1 голос
/ 21 марта 2020

Существует как минимум 4 обходных пути:

Решение 1: Верните Task, но не будьте async:

Вы можете смело игнорировать компилятор, говоря, что это асин c функция, потому что все, что заботит компилятор, это то, что функция возвращает System.Threading.Tasks.Task. Таким образом, вы можете вернуть System.Threading.Tasks.Task без использования await, хотя это означает, что вам понадобится где-то лишнее return Task.CompletedTask;:

@functions
{
    System.Threading.Tasks.Task RenderTask( Models.Task task )
    {
        <tr>
            <td class="@Model.CssClass">
                <p class="compact">
                    <span class="font-weight-bold">@task.Title</span>
                    @if (!string.IsNullOrWhiteSpace(task.Description))
                    {
                        <br />@task.Description
                    }
                </p>
            </td>
            <td class="@Model.CssClass">
                <img src="~/images/Edit.png" class="edit-area button-img" data-id="@task.Id" title="Edit" />
                <img src="~/images/Delete.png" class="delete-area button-img" data-id="@task.Id" title="Delete" />
            </td>
        </tr>

        return Task.CompletedTask;
    }
}

Решение 2. В качестве альтернативы используйте обертку:

@functions
{
    System.Threading.Tasks.Task ShutUpRazor<T>( Action<T> renderFunc, T arg )
    {
        renderFunc( arg );
        return Task.CompletedTask;
    }

    void RenderTask( Models.Task task )
    {
        <tr>
            <td class="@Model.CssClass">
                <p class="compact">
                    <span class="font-weight-bold">@task.Title</span>
                    @if (!string.IsNullOrWhiteSpace(task.Description))
                    {
                        <br />@task.Description
                    }
                </p>
            </td>
            <td class="@Model.CssClass">
                <img src="~/images/Edit.png" class="edit-area button-img" data-id="@task.Id" title="Edit" />
                <img src="~/images/Delete.png" class="delete-area button-img" data-id="@task.Id" title="Delete" />
            </td>
        </tr>
    }
}

Использование:

<section>
    @( this.ShutUpRazor( this.RenderTask, this.Model.MyTask ); )
</section>

Решение 3: Подавить предупреждения:

@{ #pragma warning disable 1998 }
@functions
{
    void RenderTask( etc )
    {
        etc
    }
}
@{ #pragma warning enable 1998 }

Решение 4: Использовать функции async и await только Yield :

@functions
{
    async System.Threading.Tasks.Task RenderTask( Models.Task task )
    {
        await Task.Yield();

        <tr>
            <td class="@Model.CssClass">
                <p class="compact">
                    <span class="font-weight-bold">@task.Title</span>
                    @if (!string.IsNullOrWhiteSpace(task.Description))
                    {
                        <br />@task.Description
                    }
                </p>
            </td>
            <td class="@Model.CssClass">
                <img src="~/images/Edit.png" class="edit-area button-img" data-id="@task.Id" title="Edit" />
                <img src="~/images/Delete.png" class="delete-area button-img" data-id="@task.Id" title="Delete" />
            </td>
        </tr>
    }
}
...