簡體   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