【发布时间】:2017-05-10 17:11:18
【问题描述】:
我有一个控制器,它接受索引操作的多个参数。此控制器通过利用 lync to sql 查询作为 PageList 返回视图。 return View(agreements.ToPagedList(pageNumber, pageSize));
我在此页面上有一张地图,用户可以对其进行缩放和平移。如果页面重新加载,地图将重新加载到其默认范围。我有一些输入,我在用户操作地图时发布范围参数。
我需要的是能够捕获这些参数,以便在重新加载/渲染视图时......它使用查询字符串中的范围参数进行渲染。我编写了处理地图的 javascript 代码,以便能够从 URL 中提取这些参数并缩放到地图上的适当位置。
我有 6 个输入由地图 javascript 操作。
<input type="text" class="extent-i vertical-align-center" readonly id="xmin-h" />
<input type="text" class="extent-i" readonly id="ymin-h" />
<input type="text" class="extent-i vertical-align-center" readonly id="xmax-h" />
<input type="text" class="extent-i" readonly id="ymax-h" />
<input type="text" class="extent-i" readonly id="wkid-h" />
<input type="hidden" id="json-h" />
这些对应于XMIN、YMIN、XMAX、YMAX、WKID(空间参考),而json是一个包含以上所有内容的对象。
使用 JQUERY 和 MutationObserver 我能够检测到这些变化。然后我使用 ajax 将它们发送到控制器。
function sendExtent(xmin,ymin,xmax,ymax,wkid){
var data = {
XMIN: xmin,
YMIN: ymin,
XMAX: xmax,
YMAX: ymax,
WKID: wkid
}
$.ajax({
url: '@Url.Action("Index","Home")',
data: data
});
var extentJson = $("#json-h").val();
var json = JSON.parse(extentJson);
XMIN = json["XMIN"];
YMIN = json["YMIN"];
XMAX = json["XMAX"];
YMAX = json["YMAX"];
WKID = json["WKID"];
}
sendExtent(XMIN, YMIN, XMAX, YMAX, WKID);
控制器如下:
public ViewResult Index(string sortOrder, string currentFilter, string searchString, int? page, double? XMIN, double? YMIN, double? XMAX, double? YMAX, int? WKID, int? AGMT_NUM, string DisplayAs)
{
ViewBag.DisplayAs = DisplayAs;
ViewBag.XMIN = XMIN;
ViewBag.YMIN = YMIN;
ViewBag.XMAX = XMAX;
ViewBag.YMAX = YMAX;
ViewBag.WKID = WKID;
(...)
(...)
// some logic to manipulate data based sortOrder etc...
int pageSize = 10;
int pageNumber = (page ?? 1);
return View(agreements.ToPagedList(pageNumber, pageSize));
ajax 调用不会重新加载页面,尽管它确实执行并且我可以确认值成功传递。根据动态地图的性质,我不希望每次都重新加载视图,因此这种行为很好。
我需要的是如何管理这些范围更改,以便在刷新或呈现视图时,例如,当对表进行排序或分页时,范围参数将发布到类似于 blah blah/?blah blah &XMIN=1234&YMIN=5678.....etc... 的 url
更新
以下是导致页面重新呈现的用户操作示例。当用户从下拉列表中选择某些内容时触发。
/button>
<ul class="dropdown-menu" id="display-as-ul">
<li>@Html.ActionLink("Agreement Type", "Index", new {DisplayAs = "Type", page = ViewBag.Page, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter })</li>
<li>@Html.ActionLink("Leese Expiration", "Index", new {DisplayAs="Expiration", page = ViewBag.Page, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter})</li>
</ul>
这会将适当的参数传递给控制器,然后控制器会重新加载页面。如上所示,“DisplayAs”参数随后存储在 URL 中。类似于我试图对范围做的事情,地图足够聪明,可以从 url 中提取该参数并操纵显示的内容。
这在这里有效,因为工作流程从 VIEW -> CONTROLLER -> VIEW(w/URL) -> EMBEDED MAP..
这在两个方面与范围问题不同: 1)页面不需要在每次extent改变时渲染,参数只需要在其他原因导致页面渲染/重新加载时发布。 2) 工作流程如下:EMBEDED MAP -> VIEW -> ????????
如果情况不妙,请告诉我你会怎么做
【问题讨论】:
-
您对负载进行计算,然后在重新/渲染部分时也需要这样做?
-
我没有使用局部视图,但也许我应该使用..
标签: c# jquery ajax asp.net-mvc razor