【发布时间】: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.forEach时checkBoundaries() === true,你能不能只添加一个标记(或采取其他预期的行动)? 我假设您的 Restaurant 课程有其他必需的信息 -
@amg-argh,但是我怎样才能删除/丢弃无效的餐厅。我的视图显示了
index操作返回的我的模型(所有餐厅)。我应该创建一个空视图并创建所有通过 javascript 显示我的列表的 html 元素吗? -
如果您查看的是“这里有 n 个地方可以为您提供东西”,那么是的,我会发送一个 empty 视图并使用 javascript 呈现它。但是我也会做一些其他的改变,1)通过 WebApi 返回餐馆列表; 2)尽可能过滤列表(如果你知道最大服务半径是50km,那么200km以外的地方不可能有效,你可以永远不发送给客户端)。但一次只做一件事。
标签: javascript asp.net-mvc google-maps