【发布时间】:2016-09-15 08:28:08
【问题描述】:
我正在尝试在我们应用程序的所有视图中实现“全局搜索”功能,该功能位于主菜单上方。它看起来像这样:
“全局搜索”是一个 jQuery 自动完成输入字段。它驻留在我们的 _Layout.cshtml 中,这是一个共享视图,并被其他视图多次加载。本质上,它将显示搜索关键字的自动建议列表。我们的关键字建议列表大约有 6000 项。
我们的 HomeController 如下所示:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult Home()
{
ViewBag.Message = " Home Page.";
GlobalSearchController controller = new GlobalSearchController();
//_Layout.cshtml uses this for the auto-complete jQuery list
var suggestions = controller.GetGlobalSearchSuggestions();
return View(suggestions);
}
public ActionResult SearchResults()
{
ViewBag.Message = "Search Results page.";
GlobalSearchController controller = new GlobalSearchController();
var searchKeyword = "technology";
//SearchResults.html uses this for the search results data
var results = controller.GetGlobalSearchResults(searchKeyword);
ViewBag.SearchKeyword = searchKeyword;
return View(results);
}
}
_Layout.cshtml 使用这个模型:
@model MyApplication.Models.GlobalSearchSuggestions
SearchResults.cshtml 使用此模型:
@model IQueryable<MyApplication.Models.GlobalSearchResult>
当我在 _Layout.cshtml 中使用 @model 声明时,我的问题就开始了。
我收到这样的错误:
Message = "传入字典的模型项是类型 'System.Web.Mvc.HandleErrorInfo',但是这个字典需要一个模型 'MyApplication.Models.GlobalSearchSuggestions' 类型的项目。"
如果我删除 _Layout.cshtml 的模型声明,并通过另一种方式(如 AJAX)检索“建议”,它将允许 SearchResults.cshtml 工作。不会产生错误。但我更愿意使用模型而不是 AJAX。因此,如果我将模型声明性保留在 _Layout.cshtml 中,则会出现异常。
我也无法从除主页以外的任何视图加载“建议”。这是为什么?如果我转到应用程序中的另一个视图,并尝试从我们的 _Layout.cshtml 小部件执行“全局搜索”,我不会在 jQuery 自动完成中获得任何“建议”或数据。为什么它只适用于 Home 视图和 Home 控制器?
如何避免此异常并同时使用 @model 声明?以及如何让 _Layout.cshtml 始终在自动完成字段中显示建议(而不仅仅是来自主页?)?
感谢任何帮助。谢谢!
【问题讨论】:
-
这听起来像是Child Actions 的一个很好的用例。此外,模型通常不会在 _Layout 页面上声明,因为它会强制您的所有视图使用该模型,这就是您看到这些错误的原因。
-
@Jasen 感谢您的建议!我尝试使用@Html.Action("SearchSuggestions", "Home") 并添加了一个名为“SearchSuggestions”的新视图,但不幸的是,它在加载_Layout.cshtml 文件时会无限循环。知道如何从 _Layout.cshtml 中删除模型吗?以及将这个全局搜索“小部件”放在哪里?
-
确保您的孩子操作
return PartialView("view", model),这样您就不会递归地重新加载_Layout。您可以在任何视图上使用全局搜索子操作 - 如果您希望在每个页面上都使用 _Layout,则它是合适的。 -
我也不认为您可以从解决方案中删除 AJAX。您将希望显示结果而不导致用户重新加载页面。
标签: asp.net-mvc razor asp.net-web-api asp.net-mvc-5 jquery-autocomplete