C# 在布局中实现全局搜索框。如何将搜索项作为查询字符串传递?
我真的很沮丧,因为我看了那么多问题,没有找到答案。我想在我的ASP Net核心项目中实现全局搜索。但我想在布局页面中实现一个搜索框,这样就可以在每个页面中使用它 我的ASP Net核心项目显示导演和电影的信息。我构建了一个独立的razor页面,用于显示搜索结果。我使用一个名为SearchTerm的属性将搜索项作为查询字符串获取,然后在数据库表中搜索它:C# 在布局中实现全局搜索框。如何将搜索项作为查询字符串传递?,c#,html,asp.net-core,razor,C#,Html,Asp.net Core,Razor,我真的很沮丧,因为我看了那么多问题,没有找到答案。我想在我的ASP Net核心项目中实现全局搜索。但我想在布局页面中实现一个搜索框,这样就可以在每个页面中使用它 我的ASP Net核心项目显示导演和电影的信息。我构建了一个独立的razor页面,用于显示搜索结果。我使用一个名为SearchTerm的属性将搜索项作为查询字符串获取,然后在数据库表中搜索它: //from Search.cshtml.cs [BindProperty(SupportsGet = true)] public strin
//from Search.cshtml.cs
[BindProperty(SupportsGet = true)]
public string SearchTerm { get; set; }
我在布局视图中实现了一个搜索框:
@model MastersOfCinema.Pages.SearchModel
// (I referenced to "SearchModel" and with this I'm only able to open that page. Other pages give the error below.)
<header>
<form method="get" class="SearchBox">
<div class="form-group">
<div class="input-group">
<input type="search" class="form-control" asp-for="SearchTerm" asp-route-searchTerm="SearchTerm" />
<span class="input-group-btn">
<button class="btn btn-default" asp-page="./../Search">
<i class="glyphicon glyphicon-search bg-light"></i>
</button>
</span>
</div>
</div>
</form>
</header>
@model MastersOfCinema.Pages.SearchModel
//(我引用了“SearchModel”,使用它我只能打开该页面。其他页面给出了以下错误。)
使用上面的代码,当我打开任何页面(除了布局中引用的搜索页面)时,都会出现此错误:
InvalidOperationException:传递到ViewDataDictionary的模型项的类型为“MastersOfCinema.Pages.Directors.IndexModel”,但此ViewDataDictionary实例需要类型为“MastersOfCinema.Pages.SearchModel”的模型项
该错误显然与@model MastersOfCinema.Pages.SearchModel有关。我不知道该换什么。如果我删除它,我会从asp for=“SearchTerm”中得到错误。因为它不识别SearchTerm属性
错误CS1963表达式树可能不包含动态
电影大师行动
我尝试了许多方法来实现全局搜索,包括局部视图和视图组件。但这是我的第一个项目,我没有经验。所以请帮帮我。给我一个简单的方法 谢谢您的帮助,如果您需要更多信息,请咨询
搜索是有效的,但正如我所说的,当我打开其他页面时会出错。我只能打开搜索页面
如果您需要查看Search.cshtml.cs的全部代码:
public class SearchModel : PageModel
{
private readonly Context _context;
public SearchModel(Context context)
{
this._context = context;
}
public IEnumerable<Director> Director { get; set; }
public IEnumerable<Movie> Movie { get; set; }
[BindProperty(SupportsGet = true)]
public string SearchTerm { get; set; }
public async Task OnGetAsync(string searchTerm)
{
Director = await _context.Director.ToListAsync();
Movie = await _context.Movie.ToListAsync();
Director = GetDirectorByName(SearchTerm);
Movie = GetMovie(SearchTerm);
SearchTerm = searchTerm;
}
public IEnumerable<Director> GetDirectorByName(string searchString)
{
var query = from r in _context.Director
where r.Name.Contains(searchString) || r.Bio.Contains(searchString) ||
r.Country.Contains(searchString) || string.IsNullOrEmpty(searchString)
orderby r.Name
select r;
if (query.Any()) { searchTermFound = true; }
return query;
}
public IEnumerable<Movie> GetMovie(string searchString)
{
var query = from r in _context.Movie
where r.Title.Contains(searchString) || string.IsNullOrEmpty(searchString)
orderby r.Title
select r;
if (query.Any()) { searchTermFound = true; }
return query;
}
public bool searchTermFound = false;
}
公共类搜索模型:PageModel
{
私有只读上下文\u上下文;
公共搜索模型(上下文)
{
这._context=context;
}
公共IEnumerable控制器{get;set;}
公共IEnumerable电影{get;set;}
[BindProperty(SupportsGet=true)]
公共字符串搜索项{get;set;}
公共异步任务OnGetAsync(字符串搜索术语)
{
Director=wait_context.Director.ToListAsync();
Movie=wait_context.Movie.toListSync();
Director=GetDirectorByName(SearchTerm);
Movie=GetMovie(SearchTerm);
SearchTerm=SearchTerm;
}
公共IEnumerable GetDirectorByName(字符串搜索字符串)
{
var query=来自_context.Director中的r
其中r.Name.Contains(searchString)| r.Bio.Contains(searchString)||
r、 Country.Contains(searchString)| string.IsNullOrEmpty(searchString)
orderby r.Name
选择r;
if(query.Any()){searchTermFound=true;}
返回查询;
}
公共IEnumerable GetMovie(字符串搜索字符串)
{
var query=来自_context.Movie中的r
其中r.Title.Contains(searchString)| | string.IsNullOrEmpty(searchString)
orderby r.Title
选择r;
if(query.Any()){searchTermFound=true;}
返回查询;
}
public bool searchTermFound=false;
}
我想在布局页面中实现一个搜索框,这样就可以在每个页面中使用它
InvalidOperationException:传递到ViewDataDictionary的模型项的类型为“MastersOfCinema.Pages.Directors.IndexModel”,但此ViewDataDictionary实例需要类型为“MastersOfCinema.Pages.SearchModel”的模型项。
要解决此问题并达到要求,您可以尝试从_Layout.cshtml中删除@model MastersOfCinema.Pages.SearchModel
,然后手动设置输入字段的名称
和值
属性,如下所示
<form method="get" class="SearchBox">
<div class="form-group">
<div class="input-group">
@*<input type="search" class="form-control" asp-for="SearchTerm" asp-route-searchTerm="SearchTerm" />*@
<input type="search" class="form-control" name="SearchTerm" value="@ViewData["SearchTerm"]" asp-route-searchTerm="SearchTerm" />
<span class="input-group-btn">
<button class="btn btn-default" asp-page="./Search">
<i class="glyphicon glyphicon-search bg-light"></i>Search
</button>
</span>
</div>
</div>
</form>
测试结果
public async Task OnGetAsync(string searchTerm)
{
//...
ViewData["SearchTerm"] = SearchTerm;
}