【问题标题】:What is the best way to filter a list of database records that can only be filtered through javascript in ASP.NET MVC在ASP.NET MVC中过滤只能通过javascript过滤的数据库记录列表的最佳方法是什么
【发布时间】:2015-11-05 05:18:54
【问题描述】:

问题:

假设我在 ASP.NET MVC Web 应用程序中有一个数据库记录列表。按只能通过 Javascript 过滤的条件过滤此列表的最佳方法是什么?

如果我的问题不清楚,请看下面的例子。

示例:

我有一个控制器操作,它在数据库中返回我的全部或部分餐厅,并在它的视图中显示所有这些餐厅:

public ActionResult Index()
{            
    return View(restaurantRepository.GetAll());
}

现在每个餐厅都有一个服务边界,它是一个多边形,我通过以下模型属性将该多边形存储在数据库中:

public class Restaurant
{
      // Other properties omitted...

      public ICollection<Coordinate> Coordinates { get; set; }
}

Coordinates 基本上是表示多边形的纬度/经度对象的集合。

现在我想要的功能是,如果我在地图上给Index 操作一个点(纬度/经度),那么Index 操作应该只返回在其服务边界(多边形)中包含该点的餐厅。

现在显然我无法在控制器中进行此过滤,因为绘制多边形并检查其中是否存在点只能通过 Google Maps API 和 Javascript 完成。

编辑: 感谢@amg-argh 的建议,我搜索了一下,看看我是否可以仅使用 C/C# 检查一个点是否在多边形内,我发现this 帖子有效。尽管如此,我的问题仍然存在。

通过 Javascript 实现此过滤的最佳方法是什么?

我自己的想法:

我想到的是

  • 首先将所有餐厅返回视图。
  • 然后在视图中我反序列化我的模型

    var model = @Html.Raw(@JsonConvert.SerializeObject(Model, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }));

  • 然后使用 forEach 遍历我的模型并提取满足该条件的餐厅。

    model.forEach(function(restaurant){
            if(checkBoundaries(restaurant, latLng))
            {
               // Valid restaurant. Save the id in an array.
            }
            else
            {
               // Invalid restaurant. discard it.
            }
    });
    
  • 然后将带有 AJAX 发布请求的有效餐厅数组发送到控制器操作,该操作返回给定餐厅 ID 的餐厅。

但这些似乎都是大量的工作和不好的做法。有什么想法吗?

【问题讨论】:

  • 您绝对可以在 C# 中执行此操作,谷歌搜索“多边形纬度经度中的 c# 点”可能会得到一些结果。但是您实际上想要实现什么,您是要显示“将在您当前位置为您提供服务的餐厅”的列表,还是您要填充一个稍后将出于其他原因使用的数据库?
  • @amg-argh,没错。我想显示“将在您当前位置为您服务的餐厅”的列表。
  • 那不用回送服务器了?在你的model.forEachcheckBoundaries() === true,你能不能只添加一个标记(或采取其他预期的行动)? 我假设您的 Restaurant 课程有其他必需的信息
  • @amg-argh,但是我怎样才能删除/丢弃无效的餐厅。我的视图显示了index 操作返回的我的模型(所有餐厅)。我应该创建一个空视图并创建所有通过 javascript 显示我的列表的 html 元素吗?
  • 如果您查看的是“这里有 n 个地方可以为您提供东西”,那么是的,我会发送一个 empty 视图并使用 javascript 呈现它。但是我也会做一些其他的改变,1)通过 WebApi 返回餐馆列表; 2)尽可能过滤列表(如果你知道最大服务半径是50km,那么200km以外的地方不可能有效,你可以永远不发送给客户端)。但一次只做一件事。

标签: javascript asp.net-mvc google-maps


【解决方案1】:

这个问题实际上可能适合另一个 stackexchange 站点,因为它更多的是关于程序设计而不是实际实现。不过,要在前端而不是后端实现这一点。

  1. 通过Index 方法加载您的视图,该视图实际上应该只包含您的视图所需的存根HTML 和基本元素。想想页眉、页脚、标题等(可能还有前端模板)
  2. 使用 WebApi 通过 AJAX 加载您的餐厅列表。所以将 return View(restaurantRepository.GetAll()); 移动到 web api 并执行类似 return Ok(restaurantRespostory.GetAll()) 的操作。
  3. 遍历结果,当if(checkBoundaries(restaurant, latLng)) 通过时,使用 JavaScript 将 HTML 元素/标记添加到地图/您尝试在视图中显示的任何视图。当它失败时,忽略它,什么也不做。

这基本上就是您想要做的所有事情,并且会为您节省回发和第二次往返服务器的时间。

虽然我也建议进行一些其他更改

  1. 使用前端 MVVM/MVC 框架(angularjs、react、knout 等)通过 JavaScript 呈现结果。过滤您的数组,并使用myViewVariable.inBoundryRestraunts = model.filter(function(r){ return checkBoundaries(r, latLng);}) 之类的内容将其绑定到视图。这样做会更整洁,而不是动态创建一堆 HTMLElement。
  2. 寻找某种方式(不需要完美)来限制来自后端的结果。尽管我不知道您的应用程序的具体细节,但我可以想象一个平均规模的城市将拥有数千家甚至数万家餐厅。下载所有这些数据以在前端进行处理需要很长时间。

【讨论】:

  • 感谢您的详尽解释。 angularjs/react/knockout 提示很棒。
猜你喜欢
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 2021-03-06
  • 1970-01-01
  • 2012-05-26
  • 2012-11-13
  • 1970-01-01
相关资源
最近更新 更多