C# 如何在asp.net MVC中使用项目列表更新视图

C# 如何在asp.net MVC中使用项目列表更新视图,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我有一个显示项目列表的视图,它有一个搜索功能。 用户第一次显示页面时,页面将显示所有项目 如果他们在搜索框中输入文本并点击提交,页面将调用一个操作,从数据库中检索要在页面上显示的项目的新列表 这是我的完整控制器。最后一行是我不确定如何传递我的参数,以及这是否是正确的方法 public IActionResult Index(IEnumerable<ItemListingModel> searchResults) { var categoryNames = _assets.Ge

我有一个显示项目列表的视图,它有一个搜索功能。 用户第一次显示页面时,页面将显示所有项目

如果他们在搜索框中输入文本并点击提交,页面将调用一个操作,从数据库中检索要在页面上显示的项目的新列表

这是我的完整控制器。最后一行是我不确定如何传递我的参数,以及这是否是正确的方法

public IActionResult Index(IEnumerable<ItemListingModel> searchResults)
{
    var categoryNames = _assets.GetCategoryNames();
    var marketNames = _assets.GetMarketCategoryNames();
    if (!searchResults.Any())
    {
        var assetItems = _assets.GetAll();
        searchResults = assetItems.Select(result => new ItemListingModel
        {
            Id = result.Id,
            ImageUrl = result.ImageUrl,
            Title = result.Title,
            Category = result.Category.Name,
            Sku = result.Sku,
            Location = result.Location,
            Available = result.Available,
            Notes = result.Notes
        });
    }

    var assetModel = new ItemIndexModel()
    {
        Items = searchResults,
        Categories = categoryNames,
        Markets = marketNames
    };

    var searchForm = new SearchFormModel()
    {
        SearchQuery = "Enter search query"
    };

    ViewModel myModel = new ViewModel();
    myModel.Item1 = assetModel;
    myModel.Item2 = searchForm;
    return View(myModel);
}

[HttpPost]
public IActionResult SearchSubmit(ViewModel search)
{
    var results = _assets.searchInventoryAssets(search.Item2.SearchQuery, search.Item2.CategoryName, search.Item2.MarketCategoryName, search.Item2.ColumnName, search.Item2.ValueExpression).Select(result => new ItemListingModel
    {
        Id = result.Id,
        ImageUrl = result.ImageUrl,
        Title = result.Title,
        Category = result.Category.Name,
        Sku = result.Sku,
        Location = result.Location,
        Available = result.Available,
        Notes = result.Notes
    });

    return //update index View with results list from this function, how can I achieve this? 
}
公共IActionResult索引(IEnumerable searchResults) { var categoryNames=_assets.GetCategoryNames(); var marketNames=_assets.GetMarketCategoryNames(); 如果(!searchResults.Any()) { var assetItems=_assets.GetAll(); searchResults=assetItems.Select(结果=>new ItemListingModel { Id=result.Id, ImageUrl=result.ImageUrl, Title=结果。Title, Category=result.Category.Name, Sku=结果。Sku, 位置=结果。位置, 可用=结果。可用, 注释=结果。注释 }); } var assetModel=new ItemIndexModel() { Items=搜索结果, 类别=类别名称, 市场=市场名称 }; var searchForm=new SearchFormModel() { SearchQuery=“输入搜索查询” }; ViewModel myModel=新的ViewModel(); myModel.Item1=资产模型; myModel.Item2=搜索表单; 返回视图(myModel); } [HttpPost] 公共IActionResult搜索提交(视图模型搜索) { var results=_assets.searchInventoryAssets(search.Item2.SearchQuery,search.Item2.CategoryName,search.Item2.MarketCategoryName,search.Item2.ColumnName,search.Item2.ValueExpression)。选择(结果=>new ItemListingModel) { Id=result.Id, ImageUrl=result.ImageUrl, Title=结果。Title, Category=result.Category.Name, Sku=结果。Sku, 位置=结果。位置, 可用=结果。可用, 注释=结果。注释 }); 返回//使用此函数的结果列表更新索引视图,如何实现此操作? }
只是一个关于编码标准的旁注:
ViewModel
不是一个好名字,我建议将这个类重命名为
SearchQueryViewModel


为什么要使用
HttpPost
进行
Search
方法

我们使用
HttpPost
将数据发送到服务器,通常我们希望保存这些数据。。。我们还可以使用URL中的
QueryString
,使用
HttpGet
向服务器发送数据

这取决于您的应用程序,但通常最好在
QueryString
中发送搜索参数,而不是在表单中发布它们。原因是:

如果使用
QueryString
,则您的url如下所示:

www.myDomain/search?Item1=xyz&Item2=abc
这意味着您的用户可以复制上述url并粘贴到电子邮件中,然后将其发送给他的朋友。。。朋友可以点击上面的url,他会看到同样的结果

但是,目前您无法执行此操作,您的url始终为:
www.myDomain/search
,搜索参数正在表单中传递

同样,这取决于您的应用程序,但如果您想更改代码,它将如下所示:

// remove [HttpPost] and use HttpGet request
public IActionResult Search(SearchQueryViewModel searchQuery)
{
    // do youe search and get the result
    var searchResult = MySearchService.Search(searchQuery);

    // here DisplaySearchResult is the name of the view which displays the search result 
     return View(searchResult, "DisplaySearchResult")
}


另外,我觉得你的
索引
操作方法不合适。。。在MVC中,控制器将构建模型,然后将该模型传递给视图。在执行
索引
操作时,您将
搜索结果
传递给
索引
方法。。。您已经在另一个控制器中生成了搜索结果,它们应该传递给视图,而不是另一个控制器。您当前的
索引
方法本质上是一个映射器,这在我看来并不正确。

只是一个关于编码标准的旁注:
ViewModel
不是一个好名字,我建议将该类重命名为
SearchQueryViewModel


为什么要使用
HttpPost
进行
Search
方法

我们使用
HttpPost
将数据发送到服务器,通常我们希望保存这些数据。。。我们还可以使用URL中的
QueryString
,使用
HttpGet
向服务器发送数据

这取决于您的应用程序,但通常最好在
QueryString
中发送搜索参数,而不是在表单中发布它们。原因是:

如果使用
QueryString
,则您的url如下所示:

www.myDomain/search?Item1=xyz&Item2=abc
这意味着您的用户可以复制上述url并粘贴到电子邮件中,然后将其发送给他的朋友。。。朋友可以点击上面的url,他会看到同样的结果

但是,目前您无法执行此操作,您的url始终为:
www.myDomain/search
,搜索参数正在表单中传递

同样,这取决于您的应用程序,但如果您想更改代码,它将如下所示:

// remove [HttpPost] and use HttpGet request
public IActionResult Search(SearchQueryViewModel searchQuery)
{
    // do youe search and get the result
    var searchResult = MySearchService.Search(searchQuery);

    // here DisplaySearchResult is the name of the view which displays the search result 
     return View(searchResult, "DisplaySearchResult")
}


另外,我觉得你的
索引
操作方法不合适。。。在MVC中,控制器将构建模型,然后将该模型传递给视图。在执行
索引
操作时,您将
搜索结果
传递给
索引
方法。。。您已经在另一个控制器中生成了搜索结果,它们应该传递给视图,而不是另一个控制器。您当前的
Index
方法本质上是一个映射器,在我看来并不正确。

您可以
返回(结果)
返回(结果,“TheNameOfYourView”)
但这不是最好的方法。正确的方法是在你做一篇传统的文章时遵循这个模式。在你的情况下,因为它只是一个搜索,所以可能不需要PRG。返回(结果)是什么意思?您的意思是将我的searchSubmit从返回IActionResult改为仅返回列表?对不起,我的意思是
返回视图(结果)
返回