Вызов компонента просмотра внутри частичного просмотра - ASP.NET Core - PullRequest
0 голосов
/ 29 января 2019

У меня есть частичное представление ("_FormCustomer"), которое отображает форму для создания клиента.У меня также есть компонент просмотра («Список стран»), который генерирует список опций стран.Теперь я хочу показать список стран в моей форме.Вот что я делаю:

Index.cshtml

<partial name="_FormCustomer" for="@Model._Customer" />

_FormCustomer.cshtml

<select asp-for="@Model.Land" class="form-control">
    @await Component.InvokeAsync("Countrylist");
</select>

CountrylistViewComponent.cs

public async Task<IViewComponentResult> InvokeAsync()
{
    return View(await _countryRepository.GetCountriesAsync());
}

(функция GetCountriesAsync возвращает список стран, это прекрасно работает)

Pages / Componenst / Countrylist/default.cshtml

@model List<Country>
@foreach (Country country in Model)
{
    <option value="@country.code">@country.name</option>
}

К сожалению, поле выбора остается пустым, когда я вызываю партиал.Когда я вызываю @await Component.InvokeAsync("Countrylist"); напрямую из Index.cshtml, он работает нормально.

Таким образом, похоже, что вы не можете использовать Компонент Представления внутри Частичного Представления.Правильно ли сделан этот вывод?Или я что-то не так делаю?

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Спасибо, Phantom2018, обнаружил проблему после вашего поста.

@ 0: я использую страницы Razor

@ 1: это не дало эффекта

@ 2:это была опечатка в моем вопросе, а не в моем коде

@ 3: отладчик показывает мне, что вызывается компонент vie, поэтому

Мой настоящий код немного отличается,Я хочу предварительно выбрать страну, если она доступна:

<select asp-for="@Model.Country" class="form-control">
    @if (Model == null)
    {
        await Component.InvokeAsync("Countrylist");
    }
    else
    {
        await Component.InvokeAsync("Countrylist", Model.Country);
    }  
</select>

И после некоторого тестирования я нашел решение:

<select asp-for="@Model.Country" class="form-control">
    @if (Model == null)
    {
        @await Component.InvokeAsync("Countrylist");
    }
    else
    {
        @await Component.InvokeAsync("Countrylist", Model.Country);
    }  
</select>

Дон 'не знаю почему, но я должен был использовать @ до того, как его ждет.

0 голосов
/ 29 января 2019

Я сейчас проверил этот сценарий и могу подтвердить, что данные загружаются нормально - и тогда, когда компонент представления непосредственно включен на страницу или когда он включен в частичное представление.(Я проверял это на страницах Razor - но, вероятно, он будет работать так же, когда используется MVC. Вы не упомянули, используете ли вы страницы MVC или Razor.)

Несколько вещей, которые вы можете попробовать увидетьесли загрузка работает нормально:

1) Из всех «Select» и «Partials» удалите атрибуты «for *».Таким образом, вы можете сначала проверить, загружаются ли данные, а затем беспокоиться о привязке к выбранному элементу.(Кроме того, в предоставленном вами коде вы пропустили переменные модели - поэтому их невозможно прокомментировать.)

2) Удалите последний ";"в вашем _FormCustomer.cshtml

<select asp-for="@Model.Land" class="form-control">
    @await Component.InvokeAsync("Countrylist")
</select>

Обратите внимание, что я удалил завершающий ";"в ожидании заявления.Я заметил, что ";"был добавлен как еще один «параметр» в select!

3) Я также заметил, что даже незначительные синтаксические ошибки (не обнаруживаемые Intellisense) могут привести к тому, что select не загружается.Отладка, чтобы увидеть, действительно ли вызывается InvokeAsync - в случае, когда произошла небольшая синтаксическая ошибка, InvokeAsync даже не вызывался.

Также имейте в виду, что:

"Когда создается частичное представление , он получает копию словаря ViewData родителя. Обновления, внесенные в данные в частичном представлении, не сохраняются в родительском представлении. Изменения ViewData в частичном представлениипотерян, когда возвращается частичное представление. "

...