商信互联
本主题描述如何使用HTML Geolocation API实现将用户的坐标传递到详细视图中的纬度和经度属性的操作。在此,假定您具有根据“使用栅格地图”教程创建的应用程序。请注意,在移动应用程序中,此功能是内置的。
将以下Controller添加到ASP.NET模块项目中。
using DevExpress.ExpressApp;
using DevExpress.ExpressApp.Editors;
using DevExpress.ExpressApp.Actions;
using DevExpress.ExpressApp.Web.SystemModule;
using DevExpress.ExpressApp.Web.Templates.ActionContainers;
using DevExpress.ExpressApp.Web.Templates.ActionContainers.Menu;
using DevExpress.Persistent.Base;
// ...
public class FillCoordinatesController : ViewController<DetailView> {
private SimpleAction getPositionAction;
public FillCoordinatesController() {
TargetObjectType = typeof(IMapsMarker);
getPositionAction = new SimpleAction(
this, "Get current position",
PredefinedCategory.Edit);
string getPositionClientScript = @"
function idContains(selector, text) {
var elements = document.querySelectorAll(selector);
return [].filter.call(elements, function(element){
return RegExp(text).test(element.id);
});
}
function setLocalizedValueToInput(input, value) {
var curValue = input.value.toString();
var newValue = value.toString();
var isCommaAsFloatPoint = curValue.indexOf(',') > -1;
if (isCommaAsFloatPoint)
newValue = newValue.replace('.', ',');
input.value = newValue;
}
function showMap(position) {
var latitude = position.coords.latitude;
var latInputs = idContains('input', 'Latitude_Edit(?!.*Info$)');
if (latInputs.length == 1) { setLocalizedValueToInput(latInputs[0], latitude); }
var longitude = position.coords.longitude;
var lonInputs = idContains('input', 'Longitude_Edit(?!.*Info$)');
if (lonInputs.length == 1) { setLocalizedValueToInput(lonInputs[0], longitude); }
}
navigator.geolocation.getCurrentPosition(showMap);";
getPositionAction.SetClientScript(getPositionClientScript, false);
}
protected override void OnActivated() {
base.OnActivated();
View.ViewEditModeChanged = DetailView_ViewEditModeChanged;
UpdateActionState();
}
protected override void OnDeactivated() {
View.ViewEditModeChanged -= DetailView_ViewEditModeChanged;
base.OnDeactivated();
}
private void DetailView_ViewEditModeChanged(object sender, System.EventArgs e) {
UpdateActionState();
}
private void UpdateActionState() {
getPositionAction.Enabled["EditMode"] = View.ViewEditMode == DevExpress.ExpressApp.Editors.ViewEditMode.Edit;
}
}
Imports Microsoft.VisualBasic
Imports DevExpress.ExpressApp
Imports DevExpress.ExpressApp.Editors
Imports DevExpress.ExpressApp.Actions
Imports DevExpress.ExpressApp.Web.SystemModule
Imports DevExpress.ExpressApp.Web.Templates.ActionContainers
Imports DevExpress.ExpressApp.Web.Templates.ActionContainers.Menu
Imports DevExpress.Persistent.Base
' ...
Public Class FillCoordinatesController
Inherits ViewController(Of DetailView)
Private getPositionAction As SimpleAction
Public Sub New()
TargetObjectType = GetType(IMapsMarker)
getPositionAction = New SimpleAction(Me, "Get current position", PredefinedCategory.Edit)
Dim getPositionClientScript As String = _
"function idContains(selector, text) {" & ControlChars.CrLf & _
" var elements = document.querySelectorAll(selector);" & ControlChars.CrLf & _
" return [].filter.call(elements, function(element){" & ControlChars.CrLf & _
" return RegExp(text).test(element.id);" & ControlChars.CrLf & _
" });" & ControlChars.CrLf & _
"}" & ControlChars.CrLf & _
ControlChars.CrLf & "function setLocalizedValueToInput(input, value) {" & ControlChars.CrLf & _
" var curValue = input.value.toString();" & ControlChars.CrLf & _
" var newValue = value.toString(); " & ControlChars.CrLf & _
" var isCommaAsFloatPoint = curValue.indexOf(',') > -1;" & ControlChars.CrLf & _
" " & ControlChars.CrLf & _
" if (isCommaAsFloatPoint)" & ControlChars.CrLf & _
" newValue = newValue.replace('.', ',');" & ControlChars.CrLf & _
ControlChars.CrLf & " input.value = newValue;" & ControlChars.CrLf & _
"}" & ControlChars.CrLf & _
ControlChars.CrLf & _
"function showMap(position) {" & ControlChars.CrLf & _
" var latitude = position.coords.latitude;" & ControlChars.CrLf & _
" var latInputs = idContains('input', 'Latitude_Edit(?!.*Info$)'); " & ControlChars.CrLf & _
" if (latInputs.length == 1) { setLocalizedValueToInput(latInputs[0], latitude); }" & ControlChars.CrLf & _
ControlChars.CrLf & " var longitude = position.coords.longitude;" & ControlChars.CrLf & _
" var lonInputs = idContains('input', 'Longitude_Edit(?!.*Info$)'); " & ControlChars.CrLf & _
" if (lonInputs.length == 1) { setLocalizedValueToInput(lonInputs[0], longitude); }" & ControlChars.CrLf & _
"}" & ControlChars.CrLf & _
ControlChars.CrLf & "navigator.geolocation.getCurrentPosition(showMap);"
getPositionAction.SetClientScript(getPositionClientScript, False)
End Sub
Protected Overrides Sub OnActivated()
MyBase.OnActivated()
AddHandler View.ViewEditModeChanged, AddressOf DetailView_ViewEditModeChanged
UpdateActionState()
End Sub
Protected Overrides Sub OnDeactivated()
RemoveHandler View.ViewEditModeChanged, AddressOf DetailView_ViewEditModeChanged
MyBase.OnDeactivated()
End Sub
Private Sub DetailView_ViewEditModeChanged(ByVal sender As Object, ByVal e As System.EventArgs)
UpdateActionState()
End Sub
Private Sub UpdateActionState()
getPositionAction.Enabled("EditMode") = View.ViewEditMode = DevExpress.ExpressApp.Editors.ViewEditMode.Edit
End Sub
End Class
运行ASP.NET应用程序并编辑一个支持IBaseMapsMarker接口的对象(例如,“使用栅格地图”主题中演示的Location对象)。点击获取当前位置。纬度和经度编辑器将填充当前坐标。
请注意,浏览器可能会警告您该站点要跟踪您的实际位置。