Компоненты .Net Core View не будут работать без пользовательской модели представления. - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть приложение MVC.Net Core 2.0 (изначально оно было 1.1 до того, как я его обновил), которое имеет странную причуду.Чтобы вызвать компонент просмотра с моей страницы, мне нужно создать собственную модель просмотра.Если я использую встроенный тип, такой как string, обработчик маршрутизации не может его найти.

Пример: я создал довольно простой ViewComponent, который я пытаюсь вызвать из моего View, которому нужна только одна строка.Но если я создал InvokeAsync (строка) вместо InvokeAsync (customVm), я получаю сообщение об ошибке, указывающее, что маршрутизация пытается использовать строковый параметр как часть пути.

ViewComponent:

public class SkilledQaPreviousComments : ViewComponent
{
    public async Task<IViewComponentResult> InvokeAsync(string vm)
    {
        return View(vm);
    }
}

Просмотр вызовов:

@await Component.InvokeAsync(nameof(SkilledQaPreviousComments), new { vm = Model.QaReviewEditReasonPrevious })

Startup.cs:

app.UseMvc(routes =>
{
    routes.MapRoute(name: "areaRoute", template: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
    routes.MapRoute(name: "default", template: "{controller=Home}/{action=Index}/{id?}");
});

Расположение файлов:

enter image description here

Сообщение об ошибке, данное Model.QaReviewEditReasonPrevious = "[\" single \ "]":

Представление 'Components / SkilledQaPreviousComments / ["test"]' не найдено.Поиск был произведен в следующих местоположениях: /Areas/NurseForms/Views/Signature/Components/SkilledQaPreviousComments/["test"].cshtml /Areas/NurseForms/Views/Shared/Components/SkilledQaPreviousComments/["test"].cshtml / Views/Components/SkilledQaPreviousComments/["test"].cshtml

Если я изменяю компонент представления, чтобы принимать int и проходить 1, я получаю ту же ошибку только с '1' вместо '["test"]'.

Я просто не могу понять, почему он не ищет Default.cshtml.Другие компоненты представления в проекте работают, но у каждого из них есть собственная модель представления.Я бы предпочел не создавать пользовательскую модель представления просто для того, чтобы каждый раз удерживать строку, но сейчас это мой единственный вариант.

Идеи / Очевидные вещи, которые я здесь сделал неправильно?

1 Ответ

0 голосов
/ 02 октября 2018

Для этой проблемы это вызвано ошибочным методом View, который вы хотите вернуть.

Проверьте исходный код ViewComponent , ниже определены методы для возврата View:

public ViewViewComponentResult View<TModel>(string viewName, TModel model);
public ViewViewComponentResult View<TModel>(TModel model);
public ViewViewComponentResult View(string viewName);
public ViewViewComponentResult View();

Когда вы возвращаете return View(vm);, который vm является строкой, онбудет соответствовать View(string viewName); для лучшего соответствия, и будет искать конкретное viewName вместо того, чтобы возвращать вид и модель по умолчанию.

Вы можете попробовать код ниже, чтобы использовать View<TModel>(TModel model);.

        public async Task<IViewComponentResult> InvokeAsync(string vm)
    {
        return View<string>(vm);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...