我有一个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?}");
});
文件位置:
给定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。项目中的其他视图组件正在运行,但是每个组件都有一个自定义视图模型。我宁愿创建一个自定义视图模型也不是每次都保留一个字符串,但这是我唯一的选择。
想法/很明显,我在这里做错了什么?
答案 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);
}