C# 在布局中实现全局搜索框。如何将搜索项作为查询字符串传递?

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

我真的很沮丧,因为我看了那么多问题,没有找到答案。我想在我的ASP Net核心项目中实现全局搜索。但我想在布局页面中实现一个搜索框,这样就可以在每个页面中使用它

我的ASP Net核心项目显示导演和电影的信息。我构建了一个独立的razor页面,用于显示搜索结果。我使用一个名为SearchTerm的属性将搜索项作为查询字符串获取,然后在数据库表中搜索它:

//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;

}