如何使用多个局部视图来过滤视图上显示的数据

时间:2017-04-23 18:17:36

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

我有一个局部视图,用于过滤需要在视图上显示的内容。 以下是我写的代码。

位置的部分视图

@using JobSite.Entities
@model IEnumerable<string>

@Html.ActionLink("All jobs", "List", "Job", null, new { @class = "btn btn-
block btn-default btn-lg" })
@foreach(var link in Model)
{
@Html.RouteLink(link, new
{
controller="Job",
action="List",
location=link},
  new
 {
    @class = "btn btn-block btn-default btn-lg"
    + (link==ViewBag.SelectedLocation?"btn-primary":"")
 })
}

公司的部分视图

@using JobSite.Entities
@model IEnumerable<string>

@Html.ActionLink("All jobs", "List", "Job", null, new { @class = "btn btn-
block btn-default btn-lg" })
@foreach(var link in Model)
{
@Html.RouteLink(link, new
{
controller="Job",
action="List",
company=link},
  new
 {
    @class = "btn btn-block btn-default btn-lg"
    + (link==ViewBag.SelectedCompany?"btn-primary":"")
 })
}

在控制器中,我根据位置过滤它。

public ViewResult List(string location)
    {
        JobListViewModel model = new JobListViewModel();
        if (location == null)
        {
            model = new JobListViewModel
            {
                jobDetails = repository.jobDetailsInterface
            };  
        }
        else
        {
            model = new JobListViewModel
            {
                jobDetails = repository.jobDetailsInterface.Where(p => p.JobLocation.LocationName == location)
            };
        }
        return View(model);
    }

如何根据部分视图中的选择显示视图中的项目?我想在购物网站中开发类似过滤条件的内容。

Sample filter used in shopping websites

1 个答案:

答案 0 :(得分:1)

我不认为每个搜索方面的一个局部视图是正确的方式(一个方面就像一个位置或公司)。我认为正确的方法是在搜索方面之上引入一个抽象级别,它可以保存关于数据结构内部每个方面的元数据,而不是将这些元数据保存为文字和不同的服务器端代码。 / p>

要完成此操作,您需要概括每个搜索方面的所有内容,以便将其表示为数据

例如,您的模型可能如下所示:

public sealed class SearchFacetLinkViewModel {
   public string Name { get; set; }
   public string Link { get; set; }
}

public sealed class SearchFacetViewModel {
   public string Description { get; set; }
   public IEnumerable<SearchFacetViewModel> Links { get; set; }
   public string SelectedFacet { get; set; }
}

然后在你看来:

@model IEnumerable<SearchFacetViewModel>

@foreach (var searchFacet in Model) {
   // Insert your above code for your views, but instead,
   // use values from the model instead of hard-coding them
   // so each facet can be generated from within the loop.
   @foreach (var facetLink in searchFacet.Links) {
      // use facetLink.Name and facetLink.Link
   }
}

您可以使用会话来存储用户指定的当前所选构面,或者您可以将所有当前构面状态嵌入到所有链接中(例如,如果选择了某个位置,则每个公司网址也会被释放)其中也有&location=。您还可以在数据库中维护用户的选择状态。

在您的控制器中,您可以接受每次提交的所有方面值,或者如果您维护facet状态服务器端,则只提供&#34; delta&#34;行动,例如&#34;删除分面位置&#34;或者&#34;添加facet company = xyz&#34;。您甚至可能希望切换到asychronus / AJAX模型,其中页面没有被重新加载,而不是返回整个视图,您的初始页面更像是一个空容器,然后AJAX调用以获取当前页面的搜索结果facets接收匹配值的JSON有效负载(这实际上通过消除维护当前构面状态服务器端的所有需要​​,使得整个客户端的构面更容易维护)。除了AJAX之外,还有空间可操作请求包含所有当前构面值的URL(不允许发生链接的默认操作,而是运行JavaScript)。

请理解分面搜索是一个相当复杂的主题,有许多细微差别。很难引导您找到全面和最佳的解决方案,特别是因为随着您的知识和能力的提高,您的项目必须逐步发展和改进。没有真正的替代品可以解决因编码选择而遇到问题的痛苦,然后学习如何克服这些问题(以便下次选择更好)。