繁体   English   中英

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

[英]how to update view with list of items in asp.net MVC

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

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

这是我的完整控制器。 最后一行是我不确定如何传递参数的地方,即使这是正确的解决方法。

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? 
}

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


为什么要使用HttpPost作为Search方法?

我们使用HttpPost将数据发送到服务器,并且通常我们要保留这些数据...我们还可以使用HttpGet使用URL中的QueryString将数据发送到服务器。

它取决于您的应用程序,但是通常最好将查询参数发送到QueryString而不要以表单形式发布它们。 原因是:

如果您使用QueryString ,那么您的网址将如下所示:

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")
}

另外,您的Index操作方法对我而言似乎不正确...在MVC中,Controller会构建模型,然后将此模型传递给View。 如果执行Index操作,则将searchResults传递给Index方法...您已经在另一个控制器中构建了搜索结果,应该将它们传递给View而不是另一个控制器。 您当前的Index方法本质上是一个映射器,对我而言似乎不正确。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM