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改为仅返回列表?对不起,我的意思是返回视图(结果)
或返回