如果没有自定义视图模型,.Net Core View组件将无法工作

时间:2018-09-28 19:52:21

标签: asp.net-core-mvc

我有一个MVC.Net Core 2.0应用程序(在升级之前,它最初是1.1),但有一个怪癖。为了从我的页面调用视图组件,我必须创建一个自定义视图模型。如果我使用内置类型(如字符串),则路由处理程序将找不到它。

示例: 我创建了一个非常简单的ViewComponent,试图从View中调用它,它只需要一个字符串。但是,如果我使用InvokeAsync(string)而不是InvokeAsync(customVm)创建,则会收到一条错误消息,提示路由正在尝试将string参数用作路径的一部分。

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 / Shared / Components / SkilledQaPreviousComments / [“ test”]。cshtml

如果我将视图组件更改为接受一个int并传递1,则只会出现'1'而不是'[“ test”]'的相同错误。

我只是弄不清楚为什么它不寻找Default.cshtml。项目中的其他视图组件正在运行,但是每个组件都有一个自定义视图模型。我宁愿创建一个自定义视图模型也不是每次都保留一个字符串,但这是我唯一的选择。

想法/很明显,我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

对于此问题,它是由您要返回的不匹配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而不是返回Default视图和模型。

您可以尝试使用下面的代码来使用View<TModel>(TModel model);

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