【问题标题】:how to update view with list of items in asp.net MVC如何使用 asp.net MVC 中的项目列表更新视图
【发布时间】:2019-09-01 01:04:42
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您可以只使用return(results)return(results, "TheNameOfYourView"),但这不是最好的方法。正确的做法是在进行传统 POST 时遵循PRG 模式。
  • 在你的情况下,因为它只是一个搜索,所以可能不需要 PRG。
  • 返回(结果)是什么意思?您的意思是将我的 searchSubmit 从返回 IActionResult 更改为仅返回列表?
  • 对不起,我的意思是 return View(results)return View(results, "TheNameOfYourView)
  • 知道了!谢谢!。使用 search.Item1 = createItemIndexModel(results);返回视图(“索引”,搜索);

标签: c# asp.net asp.net-mvc


【解决方案1】:

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


您为什么将HttpPost 用于您的Search 方法?

我们使用HttpPost 向服务器发送数据,通常我们希望持久化这些数据......我们也可以在URL 中使用QueryString 向服务器发送数据,使用HttpGet

这取决于您的应用程序,但通常最好在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 中,控制器将构建模型,然后将此模型传递给视图。在您的Index 操作的情况下,您将searchResults 传递给Index 方法......您已经在另一个控制器中构建了搜索结果,它们应该传递给视图而不是另一个控制器。您当前的 Index 方法本质上是一个映射器,这对我来说似乎不正确。

【讨论】:

  • 太有趣了,没想到会这样。是的,查询字符串可能会更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-23
  • 1970-01-01
  • 2019-08-28
相关资源
最近更新 更多