Umbraco 9 - 我创建了一个名为 SiteSearch 的页面类型和一个控制器来劫持对该页面类型页面的请求。这一切都正常工作。
控制器从一个非常简单的搜索服务获取 IEnumerable 并将其设置在 ViewModel 上,然后将其传递给视图。
但是,我根本无法获得尊重模型声明的观点。我收到错误:
ModelBindingException:无法绑定源类型 MyProject.ViewModels.SiteSearchViewModel 到模型类型 Umbraco.Cms.Core.Models.PublishedContent.IPublishedContent.
它似乎迫使我的视图使用实例 IPublishedContent (单数),即使我将模型声明为我的自定义对象。我尝试将模型声明更改为字符串只是为了看看会发生什么:
InvalidOperationException:模型项传入 ViewDataDictionary 的类型 'MyProject_Web.ViewModels.SiteSearchViewModel',但是这个 ViewDataDictionary 实例需要类型的模型项 '系统.字符串'。
它识别了模型,但是当我将自定义对象声明为模型时,它又回到尝试绑定到 IPublishedContent (单数)。我已经验证我传递的模型不为空并且实际上有结果。我不知道还能尝试什么。谁能帮我理解为什么会发生这种情况?
SiteSearchController 操作:
public override IActionResult Index()
{
var searchPage = new SiteSearch(CurrentPage, _publishedValueFallback);
var results = _searchService.QueryUmbraco("about");
var viewModel = new ViewModels.SiteSearchViewModel();
viewModel.Results = results;
return View("~/Views/SiteSearch/index.cshtml", viewModel);
}
查看:
@model MyProject_Web.ViewModels.SiteSearchViewModel
@{
Layout = "/Views/Main.cshtml";
}
<h1>Site Search Page</h1>
视图模型:
public class SiteSearchViewModel
{
public IEnumerable<IPublishedContent> Results { get; set; }
}
我刚刚想通了。我的布局视图中有以下行:
@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage
一旦我删除了它,我就不再收到错误了。它一定是强制 ViewModel 成为 IPublishedContent。